diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 6b638cad..1ab5bf1c 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -795,5 +795,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs index 4ea56957..8c16b41b 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLPgArrayToManyTest .cs @@ -13,7 +13,8 @@ namespace FreeSql.Tests.PostgreSQL [Table(Name = "pgarray_tomany_user_lazyloading")] public class UserLazyLoading { - public int Id { get; set; } + [Column(IsPrimary = true)] + public int UserId { get; set; } public int[] RoleIds { get; set; } public string UserName { get; set; } @@ -24,7 +25,8 @@ namespace FreeSql.Tests.PostgreSQL [Table(Name = "pgarray_tomany_role_lazyloading")] public class RoleLazyLoading { - public int Id { get; set; } + [Column(IsPrimary = true)] + public int RoleId { get; set; } public string RoleName { get; set; } [Navigate(nameof(UserLazyLoading.RoleIds))] @@ -40,80 +42,129 @@ namespace FreeSql.Tests.PostgreSQL var roles = new[] { - new RoleLazyLoading { Id = 1, RoleName = "role1" }, - new RoleLazyLoading { Id = 2, RoleName = "role2" }, - new RoleLazyLoading { Id = 3, RoleName = "role3" } + new RoleLazyLoading { RoleId = 1, RoleName = "role1" }, + new RoleLazyLoading { RoleId = 2, RoleName = "role2" }, + new RoleLazyLoading { RoleId = 3, RoleName = "role3" } }; Assert.Equal(3, fsql.Insert(roles).ExecuteAffrows()); var users = new[] { - new UserLazyLoading { Id = 11, RoleIds = new [] { 1,2 }, UserName = "user1" }, - new UserLazyLoading { Id = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" }, - new UserLazyLoading { Id = 13, RoleIds = new [] { 1,3 }, UserName = "user3" }, - new UserLazyLoading { Id = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" }, - new UserLazyLoading { Id = 15, RoleIds = null, UserName = "user5" }, - new UserLazyLoading { Id = 16, RoleIds = new int[0], UserName = "user6" }, + new UserLazyLoading { UserId = 11, RoleIds = new [] { 1,2 }, UserName = "user1" }, + new UserLazyLoading { UserId = 12, RoleIds = new [] { 1,2,3 }, UserName = "user2" }, + new UserLazyLoading { UserId = 13, RoleIds = new [] { 1,3 }, UserName = "user3" }, + new UserLazyLoading { UserId = 14, RoleIds = new [] { 3,2,1 }, UserName = "user4" }, + new UserLazyLoading { UserId = 15, RoleIds = null, UserName = "user5" }, + new UserLazyLoading { UserId = 16, RoleIds = new int[0], UserName = "user6" }, }; Assert.Equal(6, fsql.Insert(users).ExecuteAffrows()); - var role = fsql.Select().Where(a => a.Id == 1).First(); - Assert.IsNotType(role); + var roles3 = fsql.Select().IncludeMany(a => a.Users).ToList(); + Assert.Equal(3, roles3.Count); + var roles2 = roles3; + Assert.Equal(1, roles2[0].RoleId); + Assert.Equal("role1", roles2[0].RoleName); + Assert.Equal(2, roles2[1].RoleId); + Assert.Equal("role2", roles2[1].RoleName); + Assert.Equal(3, roles2[2].RoleId); + Assert.Equal("role3", roles2[2].RoleName); - var users2 = role.Users; + var users2 = roles2[0].Users; Assert.Equal(4, users2.Count); - Assert.Equal(11, users2[0].Id); + Assert.Equal(11, users2[0].UserId); Assert.Equal("user1", users2[0].UserName); Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); - Assert.Equal(12, users2[1].Id); + Assert.Equal(12, users2[1].UserId); Assert.Equal("user2", users2[1].UserName); Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); - Assert.Equal(13, users2[2].Id); + Assert.Equal(13, users2[2].UserId); Assert.Equal("user3", users2[2].UserName); Assert.Equal("1,3", string.Join(",", users2[2].RoleIds)); - Assert.Equal(14, users2[3].Id); + Assert.Equal(14, users2[3].UserId); Assert.Equal("user4", users2[3].UserName); Assert.Equal("3,2,1", string.Join(",", users2[3].RoleIds)); - var roles2 = users2[0].Roles; + users2 = roles2[1].Users; + Assert.Equal(3, users2.Count); + Assert.Equal(11, users2[0].UserId); + Assert.Equal("user1", users2[0].UserName); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(14, users2[2].UserId); + Assert.Equal("user4", users2[2].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); + + users2 = roles2[2].Users; + Assert.Equal(3, users2.Count); + Assert.Equal(12, users2[0].UserId); + Assert.Equal("user2", users2[0].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[0].RoleIds)); + Assert.Equal(13, users2[1].UserId); + Assert.Equal("user3", users2[1].UserName); + Assert.Equal("1,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(14, users2[2].UserId); + Assert.Equal("user4", users2[2].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[2].RoleIds)); + + var role = fsql.Select().Where(a => a.RoleId == 1).First(); + Assert.IsNotType(role); + + users2 = role.Users; + Assert.Equal(4, users2.Count); + Assert.Equal(11, users2[0].UserId); + Assert.Equal("user1", users2[0].UserName); + Assert.Equal("1,2", string.Join(",", users2[0].RoleIds)); + Assert.Equal(12, users2[1].UserId); + Assert.Equal("user2", users2[1].UserName); + Assert.Equal("1,2,3", string.Join(",", users2[1].RoleIds)); + Assert.Equal(13, users2[2].UserId); + Assert.Equal("user3", users2[2].UserName); + Assert.Equal("1,3", string.Join(",", users2[2].RoleIds)); + Assert.Equal(14, users2[3].UserId); + Assert.Equal("user4", users2[3].UserName); + Assert.Equal("3,2,1", string.Join(",", users2[3].RoleIds)); + + roles2 = users2[0].Roles; Assert.Equal(2, roles2.Count); - Assert.Equal(1, roles2[0].Id); + Assert.Equal(1, roles2[0].RoleId); Assert.Equal("role1", roles2[0].RoleName); - Assert.Equal(2, roles2[1].Id); + Assert.Equal(2, roles2[1].RoleId); Assert.Equal("role2", roles2[1].RoleName); roles2 = users2[1].Roles; Assert.Equal(3, roles2.Count); - Assert.Equal(1, roles2[0].Id); + Assert.Equal(1, roles2[0].RoleId); Assert.Equal("role1", roles2[0].RoleName); - Assert.Equal(2, roles2[1].Id); + Assert.Equal(2, roles2[1].RoleId); Assert.Equal("role2", roles2[1].RoleName); - Assert.Equal(3, roles2[2].Id); + Assert.Equal(3, roles2[2].RoleId); Assert.Equal("role3", roles2[2].RoleName); roles2 = users2[2].Roles; Assert.Equal(2, roles2.Count); - Assert.Equal(1, roles2[0].Id); + Assert.Equal(1, roles2[0].RoleId); Assert.Equal("role1", roles2[0].RoleName); - Assert.Equal(3, roles2[1].Id); + Assert.Equal(3, roles2[1].RoleId); Assert.Equal("role3", roles2[1].RoleName); roles2 = users2[3].Roles; Assert.Equal(3, roles2.Count); - Assert.Equal(3, roles2[0].Id); + Assert.Equal(3, roles2[0].RoleId); Assert.Equal("role3", roles2[0].RoleName); - Assert.Equal(2, roles2[1].Id); + Assert.Equal(2, roles2[1].RoleId); Assert.Equal("role2", roles2[1].RoleName); - Assert.Equal(1, roles2[2].Id); + Assert.Equal(1, roles2[2].RoleId); Assert.Equal("role1", roles2[2].RoleName); - var user = fsql.Select().Where(a => a.Id == 11).First(); + var user = fsql.Select().Where(a => a.UserId == 11).First(); Assert.IsNotType(user); roles2 = user.Roles; Assert.Equal(2, roles2.Count); - Assert.Equal(1, roles2[0].Id); + Assert.Equal(1, roles2[0].RoleId); Assert.Equal("role1", roles2[0].RoleName); - Assert.Equal(2, roles2[1].Id); + Assert.Equal(2, roles2[1].RoleId); Assert.Equal("role2", roles2[1].RoleName); } } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 5262560d..35fff582 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -1028,13 +1028,13 @@ namespace FreeSql.Internal if (pnvBind == null && trycol == null) { var findtbrefPkCsName = tbref.Primarys[0].CsName.TrimStart('_'); - if (findtbrefPkCsName.StartsWith(trytb.Type.Name, StringComparison.CurrentCultureIgnoreCase)) findtbrefPkCsName = findtbrefPkCsName.Substring(trytb.Type.Name.Length).TrimStart('_'); + if (findtbrefPkCsName.StartsWith(tbref.Type.Name, StringComparison.CurrentCultureIgnoreCase)) findtbrefPkCsName = findtbrefPkCsName.Substring(trytb.Type.Name.Length).TrimStart('_'); var findtrytb = pnv.Name; if (findtrytb.EndsWith($"{tbref.CsName}s", StringComparison.CurrentCultureIgnoreCase)) findtrytb = findtrytb.Substring(0, findtrytb.Length - tbref.CsName.Length - 1); findtrytb += tbref.CsName; if ( - tbref.ColumnsByCs.TryGetValue($"{findtrytb}{findtbrefPkCsName}", out trycol) == false && //骆峰命名 - tbref.ColumnsByCs.TryGetValue($"{findtrytb}_{findtbrefPkCsName}", out trycol) == false //下划线命名 + trytb.ColumnsByCs.TryGetValue($"{findtrytb}{findtbrefPkCsName}s", out trycol) == false && //骆峰命名 + trytb.ColumnsByCs.TryGetValue($"{findtrytb}_{findtbrefPkCsName}s", out trycol) == false //下划线命名 ) { } @@ -1077,11 +1077,11 @@ namespace FreeSql.Internal var findtrytbPkCsName = trytb.Primarys[0].CsName.TrimStart('_'); if (findtrytbPkCsName.StartsWith(trytb.Type.Name, StringComparison.CurrentCultureIgnoreCase)) findtrytbPkCsName = findtrytbPkCsName.Substring(trytb.Type.Name.Length).TrimStart('_'); var findtrytb = pnv.Name; - if (findtrytb.EndsWith($"{tbref.CsName}s", StringComparison.CurrentCultureIgnoreCase)) findtrytb = findtrytb.Substring(0, findtrytb.Length - tbref.CsName.Length - 1); + if (findtrytb.EndsWith($"{trytb.CsName}s", StringComparison.CurrentCultureIgnoreCase)) findtrytb = findtrytb.Substring(0, findtrytb.Length - trytb.CsName.Length - 1); findtrytb += trytb.CsName; if ( - tbref.ColumnsByCs.TryGetValue($"{findtrytb}{findtrytbPkCsName}", out trycol) == false && //骆峰命名 - tbref.ColumnsByCs.TryGetValue($"{findtrytb}_{findtrytbPkCsName}", out trycol) == false //下划线命名 + tbref.ColumnsByCs.TryGetValue($"{findtrytb}{findtrytbPkCsName}s", out trycol) == false && //骆峰命名 + tbref.ColumnsByCs.TryGetValue($"{findtrytb}_{findtrytbPkCsName}s", out trycol) == false //下划线命名 ) { } @@ -1098,7 +1098,7 @@ namespace FreeSql.Internal cscodeExtLogic1 = $" if (this.{trytb.Primarys[0].CsName} == null) return null;\r\n"; } lmbdWhere.Append(")"); - nvref.Columns.Add(tbref.Primarys[0]); + nvref.Columns.Add(trytb.Primarys[0]); nvref.RefColumns.Add(trycol); nvref.RefEntityType = tbref.Type; nvref.RefType = TableRefType.PgArrayToMany;