diff --git a/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs b/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs index 39ce49128..39e7df2c7 100644 --- a/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs +++ b/Src/Asp.Net/SqlServerTest/Demo/Demo3_Insertable.cs @@ -30,7 +30,7 @@ namespace OrmTest } }); - var insertObj = new Order() { Id = 1, Name = "order1",Price=0 }; + var insertObj = new Order() { Id = 1, Name = "order1", Price = 0 }; var insertObjs = new List { new Order() { Id = 11, Name = "order11", Price=0 }, new Order() { Id = 12, Name = "order12" , Price=0} @@ -56,7 +56,43 @@ namespace OrmTest }; db.Insertable(insertObjs).UseSqlServer().ExecuteBlueCopy(); + db.Insertable(new Order() + { + Name = "订单 1", + CustomId = 1, + Price = 100, + CreateTime = DateTime.Now, + Id = 0, + Items = new List() { + new OrderItem(){ + CreateTime=DateTime.Now, + OrderId=0, + Price=1, + ItemId=1 + } + } + }) + .AddSubList(it => it.Items.First().OrderId).ExecuteReturnPrimaryKey(); + + db.CodeFirst.InitTables(); + db.Insertable(new SubInsertTest() + { + Name="aa", + SubInsertTestItem1=new SubInsertTestItem1() { + a="nn" + }, + SubInsertTestItem=new SubInsertTestItem() + { + Name ="item" , + TestId=2 + } + }) + .AddSubList(it => it.SubInsertTestItem1) + .AddSubList(it => it.SubInsertTestItem.TestId) + .ExecuteReturnPrimaryKey(); + Console.WriteLine("#### Insertable End ####"); + } } } diff --git a/Src/Asp.Net/SqlServerTest/Models/SubInsertTest.cs b/Src/Asp.Net/SqlServerTest/Models/SubInsertTest.cs new file mode 100644 index 000000000..41fe5d982 --- /dev/null +++ b/Src/Asp.Net/SqlServerTest/Models/SubInsertTest.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OrmTest +{ + public class SubInsertTest + { + [SqlSugar.SugarColumn(IsPrimaryKey =true,IsIdentity =true)] + public int Id { get; set; } + public string Name { get; set; } + [SqlSugar.SugarColumn(IsIgnore =true)] + public SubInsertTestItem SubInsertTestItem { get; set; } + [SqlSugar.SugarColumn(IsIgnore = true)] + public SubInsertTestItem1 SubInsertTestItem1 { get; set; } + [SqlSugar.SugarColumn(IsIgnore = true)] + public List SubInsertTestItem2 { get; set; } + } + + public class SubInsertTestItem + { + [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)] + public int Id { get; set; } + public int TestId { get; set; } + public string Name { get; set; } + } + public class SubInsertTestItem1 + { + public string a { get; set; } + } + public class SubInsertTestItem2 + { + public int OrderId { get; set; } + public int xid { get; set; } + public string a { get; set; } + } +} diff --git a/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj b/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj index 5c6382bea..7895aabb9 100644 --- a/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj +++ b/Src/Asp.Net/SqlServerTest/SqlServerTest.csproj @@ -70,6 +70,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs index 30ad7006f..0bac6db4a 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableProvider.cs @@ -251,6 +251,29 @@ namespace SqlSugar diffModel.DiffType = DiffType.insert; return this; } + + public ISubInsertable AddSubList(Expression> items) + { + 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 "); + + string subMemberName; + object sublist; + SubInsertable result = new SubInsertable(); + result.GetList(this.InsertObjs,items, out subMemberName, out sublist); + result.InsertObject = this.InsertObjs.First(); + result.Context = this.Context; + result.SubList = new Dictionary(); + result.SubList.Add(subMemberName, sublist); + result.InsertBuilder = this.InsertBuilder; + result.Pk = GetPrimaryKeys().First(); + result.Entity = this.EntityInfo; + return result; + } + + #endregion #region Protected Methods diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SubInserable.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SubInserable.cs new file mode 100644 index 000000000..07c37b416 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/SubInserable.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class SubInsertable : ISubInsertable where T : class, new() + { + internal EntityInfo Entity { get; set; } + internal Dictionary SubList { get; set; } + internal SqlSugarProvider Context { get; set; } + internal T InsertObject { get; set; } + internal InsertBuilder InsertBuilder { get; set; } + internal string Pk { get; set; } + + public ISubInsertable AddSubList(Expression> items) + { + string subMemberName; + object sublist; + GetList(new T[] { InsertObject }, items,out subMemberName,out sublist); + if (!this.SubList.ContainsKey(subMemberName)) + { + this.SubList.Add(subMemberName, sublist); + } + return this; + } + + public object ExecuteReturnPrimaryKey() + { + List conModel = new List(); + int id = this.Context.Insertable(InsertObject).ExecuteReturnIdentity(); + int count = 1; + object pkValue = null; + var qureyable = this.Context.Queryable(); + if (id.ObjToInt() == 0) + { + var primaryProperty = this.Entity.Columns.FirstOrDefault(it => + it.PropertyName.Equals(this.Pk, StringComparison.CurrentCultureIgnoreCase) || + it.DbColumnName.Equals(this.Pk, StringComparison.CurrentCultureIgnoreCase) + ); + pkValue = primaryProperty.PropertyInfo.GetValue(InsertObject); + qureyable.In(pkValue); + } + else + { + qureyable.In(id); + pkValue = id; + } + var data = qureyable.First(); + foreach (var item in this.SubList) + { + + Dictionary insertDictionary = new Dictionary(); + if (item.Value == null) + { + continue; + } + EntityInfo subEntity = null; + if (item.Value is IEnumerable) + { + var list=item.Value as IEnumerable; + if (list.Count() == 0) + { + continue; + } + var type= list.First().GetType(); + this.Context.InitMappingInfo(type); + subEntity=this.Context.EntityMaintenance.GetEntityInfo(type); + foreach (var sbItem in list) + { + SetItems(insertDictionary, sbItem, subEntity,item.Key,pkValue); + } + } + else if (item.Value.GetType().IsClass()) + { + var type = item.Value.GetType(); + this.Context.InitMappingInfo(type); + subEntity = this.Context.EntityMaintenance.GetEntityInfo(type); + SetItems(insertDictionary, item.Value, subEntity,item.Key,pkValue); + } + count+=this.Context.Insertable(insertDictionary).AS(subEntity.DbTableName).ExecuteCommand(); + } + return count; + } + public void GetList(T[] inserts,Expression> items, out string subMemberName, out object sublist) + { + var lambdaExpression = (items as LambdaExpression).Body; + if (lambdaExpression is UnaryExpression) + { + lambdaExpression = (lambdaExpression as UnaryExpression).Operand; + } + MemberExpression subMemberException = lambdaExpression as MemberExpression; + subMemberName = subMemberException.Member.Name; + MemberExpression listMember = null; + sublist = null; + if (subMemberException.Expression is MethodCallExpression) + { + listMember = (subMemberException.Expression as MethodCallExpression).Arguments.First() as MemberExpression; + + } + else + { + listMember = (subMemberException.Expression as MemberExpression); + } + if (listMember == null) + { + listMember = (items as LambdaExpression).Body as MemberExpression; + subMemberName = Guid.NewGuid().ToString(); + } + sublist = inserts.First().GetType().GetProperty(listMember.Member.Name).GetValue(inserts.First()); + } + private void SetItems(Dictionary insertDictionary, object sbItem, EntityInfo subEntity,string key,object pkValue) + { + foreach (var item in subEntity.Columns) + { + if (item.IsIdentity||item.IsIgnore) + continue; + if (item.PropertyInfo.Name == key) + { + insertDictionary.Add(item.DbColumnName, pkValue); + } + else + { + insertDictionary.Add(item.DbColumnName, item.PropertyInfo.GetValue(sbItem)); + } + } + } + } +} diff --git a/Src/Asp.Net/SqlSugar/Interface/ISubInsertable.cs b/Src/Asp.Net/SqlSugar/Interface/ISubInsertable.cs new file mode 100644 index 000000000..70c75ffc9 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/Interface/ISubInsertable.cs @@ -0,0 +1,11 @@ +using System; +using System.Linq.Expressions; + +namespace SqlSugar +{ + public interface ISubInsertable + { + ISubInsertable AddSubList(Expression> items); + 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 a4522b260..b49e64f0c 100644 --- a/Src/Asp.Net/SqlSugar/Interface/Insertable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/Insertable.cs @@ -29,6 +29,7 @@ namespace SqlSugar IInsertable IgnoreColumns(params string[]columns); IInsertable IgnoreColumns(bool ignoreNullColumn, bool isOffIdentity = false); + ISubInsertable AddSubList(Expression> SubForeignKey); IInsertable EnableDiffLogEvent(object businessData = null); IInsertable RemoveDataCache(); diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 4c0fafde4..3984682eb 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -80,6 +80,8 @@ + +