From abfb8232c87411282d32b09a8517c230a763a962 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 2 Sep 2022 23:41:04 +0800 Subject: [PATCH] AggregateRootRepository --- FreeSql.Repository/AggregateRootRepository.cs | 1 - .../AggregateRootRepositorySync.cs | 11 ++++++-- FreeSql.Repository/AggregateRootUtils.cs | 28 +++++++++---------- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/FreeSql.Repository/AggregateRootRepository.cs b/FreeSql.Repository/AggregateRootRepository.cs index b9d2f527..baecd9fd 100644 --- a/FreeSql.Repository/AggregateRootRepository.cs +++ b/FreeSql.Repository/AggregateRootRepository.cs @@ -52,7 +52,6 @@ namespace FreeSql _repository.AsTable(rule); _asTableRule = rule; } - TableInfo _table; public Type EntityType => _repository.EntityType; public IDataFilter DataFilter => _repository.DataFilter; diff --git a/FreeSql.Repository/AggregateRootRepositorySync.cs b/FreeSql.Repository/AggregateRootRepositorySync.cs index 1f446b5c..669b8f67 100644 --- a/FreeSql.Repository/AggregateRootRepositorySync.cs +++ b/FreeSql.Repository/AggregateRootRepositorySync.cs @@ -156,7 +156,8 @@ namespace FreeSql { var stateKey = Orm.GetEntityKeyString(EntityType, entity, false); if (entity == null) throw new ArgumentNullException(nameof(entity)); - if (_table.Primarys.Any() == false) throw new Exception(DbContextStrings.CannotAdd_EntityHasNo_PrimaryKey(Orm.GetEntityString(EntityType, entity))); + var table = Orm.CodeFirst.GetTableByEntity(EntityType); + if (table.Primarys.Any() == false) throw new Exception(DbContextStrings.CannotAdd_EntityHasNo_PrimaryKey(Orm.GetEntityString(EntityType, entity))); var flagExists = ExistsInStates(entity); if (flagExists == false) @@ -169,8 +170,12 @@ namespace FreeSql var affrows = UpdateAggregateRoot(new[] { entity }); if (affrows > 0) return entity; } - Orm.ClearEntityPrimaryValueWithIdentity(EntityType, entity); - return InsertAggregateRoot(new[] { entity }).FirstOrDefault(); + if (table.Primarys.Where(a => a.Attribute.IsIdentity).Count() == table.Primarys.Length) + { + Orm.ClearEntityPrimaryValueWithIdentity(EntityType, entity); + return InsertAggregateRoot(new[] { entity }).FirstOrDefault(); + } + throw new Exception(DbContextStrings.CannotAdd_PrimaryKey_NotSet(Orm.GetEntityString(EntityType, entity))); } protected virtual int UpdateAggregateRoot(IEnumerable entitys) { diff --git a/FreeSql.Repository/AggregateRootUtils.cs b/FreeSql.Repository/AggregateRootUtils.cs index 9128522e..eb307f99 100644 --- a/FreeSql.Repository/AggregateRootUtils.cs +++ b/FreeSql.Repository/AggregateRootUtils.cs @@ -116,29 +116,29 @@ static class AggregateRootUtils } if (collectionBefore != null && collectionAfter == null) { - foreach (var item in collectionBefore as IEnumerable) - { - deleteLog.Add(NativeTuple.Create(elementType, new[] { item })); - NavigateReader(fsql, elementType, item, (path, tr, ct, stackvs) => - { - var dellist = stackvs.First() as object[] ?? new [] { stackvs.First() }; - deleteLog.Add(NativeTuple.Create(ct, dellist)); - }); - } + //foreach (var item in collectionBefore as IEnumerable) + //{ + // deleteLog.Add(NativeTuple.Create(elementType, new[] { item })); + // NavigateReader(fsql, elementType, item, (path, tr, ct, stackvs) => + // { + // var dellist = stackvs.First() as object[] ?? new [] { stackvs.First() }; + // deleteLog.Add(NativeTuple.Create(ct, dellist)); + // }); + //} return; } Dictionary dictBefore = new Dictionary(); Dictionary dictAfter = new Dictionary(); foreach (var item in collectionBefore as IEnumerable) { - var beforeKey = fsql.GetEntityKeyString(elementType, item, false); - dictBefore.Add(beforeKey, item); + var key = fsql.GetEntityKeyString(elementType, item, false); + if (key != null) dictBefore.Add(key, item); } foreach (var item in collectionAfter as IEnumerable) { - var afterKey = fsql.GetEntityKeyString(elementType, item, false); - if (afterKey != null) insertLog.Add(NativeTuple.Create(elementType, item)); - else dictBefore.Add(afterKey, item); + var key = fsql.GetEntityKeyString(elementType, item, false); + if (key != null) insertLog.Add(NativeTuple.Create(elementType, item)); + else dictAfter.Add(key, item); } foreach (var key in dictBefore.Keys.ToArray()) {