diff --git a/Src/Asp.Net/SqlServerTest/UnitTest/UInsert.cs b/Src/Asp.Net/SqlServerTest/UnitTest/UInsert.cs index 6bd6c405d..6e19fa44d 100644 --- a/Src/Asp.Net/SqlServerTest/UnitTest/UInsert.cs +++ b/Src/Asp.Net/SqlServerTest/UnitTest/UInsert.cs @@ -11,8 +11,9 @@ namespace OrmTest public static void Insert() { var db = Db; - db.DbMaintenance.TruncateTable(); + db.CodeFirst.InitTables(); + db.DbMaintenance.TruncateTable(); db.Insertable(new List { new UinitBlukTable(){ Id=1,Create=DateTime.Now, Name="00" }, @@ -66,8 +67,8 @@ namespace OrmTest db.DbMaintenance.TruncateTable(); db.Insertable(new UinitBlukTable() { Id = 2, Name = "b", Create = DateTime.Now }).ExecuteCommand(); var x=Db.Storageable(list2) - .SplitInsert(it => it.NotAny(y=>y.Id==it.Item.Id)) - .SplitUpdate(it => it.Any(y => y.Id == it.Item.Id)) + .SplitInsert(it => it.NotAny()) + .SplitUpdate(it => it.Any()) .SplitDelete(it=>it.Item.Id>10) .SplitIgnore(it=>it.Item.Id==1) .SplitError(it => it.Item.Id == 3,"id不能等于3") diff --git a/Src/Asp.Net/SqlSugar/Abstract/SaveableProvider/Storageable.cs b/Src/Asp.Net/SqlSugar/Abstract/SaveableProvider/Storageable.cs index 415203ed9..1618c3a9f 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SaveableProvider/Storageable.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SaveableProvider/Storageable.cs @@ -62,6 +62,7 @@ namespace SqlSugar public StorageableResult ToStorage() { + var entity = this.Context.EntityMaintenance.GetEntityInfo(); if (this.allDatas.Count == 0) return new StorageableResult(); var pkInfos = this.Context.EntityMaintenance.GetEntityInfo().Columns.Where(it => it.IsPrimarykey); @@ -76,10 +77,12 @@ namespace SqlSugar dbDataList.AddRange(addItems); }); } + var pkProperties = GetPkProperties(pkInfos, entity); var messageList = allDatas.Select(it => new StorageableMessage() { Item = it.Item, - Database = dbDataList + Database = dbDataList, + PkFields= pkProperties }).ToList(); foreach (var item in whereFuncs.OrderByDescending(it => (int)it.key)) { @@ -120,6 +123,12 @@ namespace SqlSugar return result; } + private string[] GetPkProperties(IEnumerable pkInfos,EntityInfo entity) + { + return entity.Columns + .Where(it => it.IsPrimarykey||pkInfos.Any(y=>y.PropertyName==it.PropertyName)).Select(it => it.PropertyName).ToArray(); + } + public IStorageable WhereColumns(Expression> columns) { if (columns == null) diff --git a/Src/Asp.Net/SqlSugar/Interface/IStorageable.cs b/Src/Asp.Net/SqlSugar/Interface/IStorageable.cs index cced69317..bea168f45 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IStorageable.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IStorageable.cs @@ -22,6 +22,7 @@ namespace SqlSugar { public T Item { get; set; } internal List Database { get; set; } + internal string[] PkFields { get; set; } public bool Any(Func expression) { return Database.Any(expression); @@ -30,6 +31,19 @@ namespace SqlSugar { return !Database.Any(expression); } + public bool Any() + { + var list = Database.Where(it=>true); + foreach (var pk in PkFields) + { + list = list.Where(it => it.GetType().GetProperty(pk).GetValue(it, null).ObjToString() == Item.GetType().GetProperty(pk).GetValue(Item, null).ObjToString()); + } + return list.Any(); + } + public bool NotAny() + { + return !Any(); + } } public class StorageableMessage : StorageableInfo where T : class, new()