diff --git a/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs b/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs index bebf51dee..425002f5b 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs @@ -98,7 +98,8 @@ namespace OrmTest TwoItem2=new TwoItem2() { Id="1", ThreeItem2=new List(){ - new ThreeItem2(){ Name="a", TwoItem2Id="1" } + new ThreeItem2(){ Name="a", TwoItem2Id="1" }, + new ThreeItem2(){ Id=2, Name="a2", TwoItem2Id="2" } } }, TwoItem=new TwoItem() @@ -130,19 +131,95 @@ namespace OrmTest } }) .AddSubList(it => it.TwoItem.RootId) - .AddSubList(it => new GetSubInsertTree() + .AddSubList(it => new SubInsertTree() { Expression = it.TwoItem2.RootId, - ChildExpression=new List() { - new GetSubInsertTree(){ + ChildExpression=new List() { + new SubInsertTree(){ Expression=it.TwoItem2.ThreeItem2.First().TwoItem2Id } } }) .AddSubList(it => it.TwoItem3) - .ExecuteReturnPrimaryKey(); + .ExecuteReturnPrimaryKey(); + db.CodeFirst.InitTables(); + db.DbMaintenance.TruncateTable("Country"); + db.DbMaintenance.TruncateTable("Province"); + db.DbMaintenance.TruncateTable("City"); + db.Insertable(new List() + { + new Country(){ + Id=1, + Name="中国", + Provinces=new List(){ + new Province{ + Id=1001, + Name="江苏", + citys=new List(){ + new City(){ Id=1001001, Name="南通" }, + new City(){ Id=1001002, Name="南京" } + } + }, + new Province{ + Id=1002, + Name="上海", + citys=new List(){ + new City(){ Id=1002001, Name="徐汇" }, + new City(){ Id=1002002, Name="普陀" } + } + }, + new Province{ + Id=1003, + Name="北京", + citys=new List(){ + new City(){ Id=1003001, Name="北京A" }, + new City(){ Id=1003002, Name="北京B" } + } + } + } + }, + new Country(){ + Name="美国", + Id=2, + Provinces=new List() + { + new Province(){ + Name="美国小A", + Id=20001 + }, + new Province(){ + Name="美国小b", + Id=20002 + } + } + }, + new Country(){ + Name="英国", + Id=3 + } + }) + .AddSubList(it => new SubInsertTree() + { + Expression = it.Provinces.First().CountryId, + ChildExpression = new List() { + new SubInsertTree(){ + Expression=it.Provinces.First().citys.First().ProvinceId + } + } + }) + .ExecuteReturnPrimaryKey(); + + var list= db.Queryable() + .Mapper(it => it.Provinces, it => it.Provinces.First().CountryId) + .Mapper(it=> { + foreach (var item in it.Provinces) + { + item.citys = db.Queryable().Where(y => y.ProvinceId == item.Id).ToList(); + } + }) + .ToList(); Console.WriteLine("#### Insertable End ####"); diff --git a/Src/Asp.Net/SqlServerTest/Models/SubInsertTest.cs b/Src/Asp.Net/SqlServerTest/Models/SubInsertTest.cs index 6f93b566e..f30a90754 100644 --- a/Src/Asp.Net/SqlServerTest/Models/SubInsertTest.cs +++ b/Src/Asp.Net/SqlServerTest/Models/SubInsertTest.cs @@ -18,7 +18,6 @@ namespace OrmTest [SqlSugar.SugarColumn(IsIgnore = true)] public List TwoItem3 { get; set; } } - public class TwoItem { [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)] @@ -49,4 +48,32 @@ namespace OrmTest public string Name { get; set; } public string TwoItem2Id { get; set; } } + + public class Country + { + [SqlSugar.SugarColumn(IsPrimaryKey = true)] + public int Id { get; set; } + public string Name { get; set; } + + [SqlSugar.SugarColumn(IsIgnore = true)] + public List Provinces { get; set; } + } + + public class Province + { + [SqlSugar.SugarColumn(IsPrimaryKey =true)] + public int Id { get; set; } + public string Name { get; set; } + public int CountryId { get; set; } + [SqlSugar.SugarColumn(IsIgnore = true)] + public List citys { get; set; } + } + + public class City + { + [SqlSugar.SugarColumn(IsPrimaryKey = true)] + public int Id { get; set; } + public int ProvinceId { get; set; } + public string Name { get; set; } + } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs index 8d45a9d4b..a9a26b61e 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs @@ -272,9 +272,25 @@ namespace SqlSugar result.Entity = this.EntityInfo; return result; } - public ISubInsertable AddSubList(Expression> tree) + public ISubInsertable AddSubList(Expression> tree) { - return null; + Check.Exception(GetPrimaryKeys().Count == 0, typeof(T).Name + " need Primary key"); + Check.Exception(GetPrimaryKeys().Count > 1, typeof(T).Name + "Multiple primary keys are not supported"); + //Check.Exception(this.InsertObjs.Count() > 1, "SubInserable No Support Insertable(List)"); + //Check.Exception(items.ToString().Contains(".First().")==false, items.ToString()+ " not supported "); + if (this.InsertObjs == null || this.InsertObjs.Count() == 0) + { + return new SubInsertable(); + } + SubInsertable result = new SubInsertable(); + result.InsertObjects = this.InsertObjs; + result.Context = this.Context; + result.SubList = new List(); + result.InsertBuilder = this.InsertBuilder; + result.Pk = GetPrimaryKeys().First(); + result.Entity = this.EntityInfo; + result.AddSubList(tree); + return result; } #endregion diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SubInserable.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SubInserable.cs index d91352e05..56a022e11 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SubInserable.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SubInserable.cs @@ -23,7 +23,7 @@ namespace SqlSugar this.SubList.Add(new SubInsertTreeExpression() { Expression = items }); return this; } - public ISubInsertable AddSubList(Expression> tree) + public ISubInsertable AddSubList(Expression> tree) { var lamda = (tree as LambdaExpression); var memInit = lamda.Body as MemberInitExpression; @@ -112,7 +112,13 @@ namespace SqlSugar MemberExpression subMemberException; string subMemberName = GetMemberName(item, out subMemberException); string childName = GetChildName(item, subMemberException); - var childList = insertObject.GetType().GetProperty(childName).GetValue(insertObject); + var childListProperty = insertObject.GetType().GetProperty(childName); + if (childListProperty == null) + { + childName = subMemberName; + childListProperty = insertObject.GetType().GetProperty(childName); + } + var childList = childListProperty.GetValue(insertObject); if (childList != null) { if (!(childList is IEnumerable)) @@ -193,10 +199,14 @@ namespace SqlSugar { listMember = (subMemberException.Expression as MemberExpression); } - if (listMember == null) + if (listMember == null&& item.Expression is LambdaExpression) { listMember = (item.Expression as LambdaExpression).Body as MemberExpression; } + if (listMember == null && item.Expression is MemberExpression) + { + listMember = item.Expression as MemberExpression; + } childName = listMember.Member.Name; return childName; } diff --git a/Src/Asp.Net/SqlSugar/Entities/SubInsertTree.cs b/Src/Asp.Net/SqlSugar/Entities/SubInsertTree.cs index 961e6b63d..41b9ee3c8 100644 --- a/Src/Asp.Net/SqlSugar/Entities/SubInsertTree.cs +++ b/Src/Asp.Net/SqlSugar/Entities/SubInsertTree.cs @@ -7,10 +7,10 @@ using System.Threading.Tasks; namespace SqlSugar { - public class GetSubInsertTree + public class SubInsertTree { public object Expression { get; set; } - public List ChildExpression { get; set; } + public List ChildExpression { get; set; } } internal class SubInsertTreeExpression diff --git a/Src/Asp.Net/SqlSugar/Interface/ISubInsertable.cs b/Src/Asp.Net/SqlSugar/Interface/ISubInsertable.cs index b93d92414..ccbfd0064 100644 --- a/Src/Asp.Net/SqlSugar/Interface/ISubInsertable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/ISubInsertable.cs @@ -6,7 +6,7 @@ namespace SqlSugar public interface ISubInsertable { ISubInsertable AddSubList(Expression> items); - ISubInsertable AddSubList(Expression> tree); + ISubInsertable AddSubList(Expression> tree); object ExecuteReturnPrimaryKey(); } } \ No newline at end of file diff --git a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs index f362f6864..5f0c22252 100644 --- a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs @@ -30,7 +30,7 @@ namespace SqlSugar IInsertable IgnoreColumns(bool ignoreNullColumn, bool isOffIdentity = false); ISubInsertable AddSubList(Expression> subForeignKey); - ISubInsertable AddSubList(Expression> tree); + ISubInsertable AddSubList(Expression> tree); IInsertable EnableDiffLogEvent(object businessData = null); IInsertable RemoveDataCache();