diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index 5ac51506..3bc06c8a 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -69,24 +69,13 @@ namespace FreeSql protected virtual IInsert OrmInsert(TEntity entity) { var insert = OrmInsert(); - if (entity != null) - { - (insert as InsertProvider)._source.Add(entity); //防止 Aop.AuditValue 触发两次 - if (_db.Options.AuditValue != null) - _db.Options.AuditValue(new DbContextAuditValueEventArgs(Aop.AuditValueType.Insert, _table.Type, entity)); - } + if (entity != null) (insert as InsertProvider)._source.Add(entity); //防止 Aop.AuditValue 触发两次 return insert; } protected virtual IInsert OrmInsert(IEnumerable entitys) { var insert = OrmInsert(); - if (entitys != null) - { - (insert as InsertProvider)._source.AddRange(entitys.Where(a => a != null)); //防止 Aop.AuditValue 触发两次 - if (_db.Options.AuditValue != null) - foreach (var item in entitys) - _db.Options.AuditValue(new DbContextAuditValueEventArgs(Aop.AuditValueType.Insert, _table.Type, item)); - } + if (entitys != null) (insert as InsertProvider)._source.AddRange(entitys.Where(a => a != null)); //防止 Aop.AuditValue 触发两次 return insert; } @@ -95,13 +84,7 @@ namespace FreeSql var update = _db.OrmOriginal.Update().AsType(_entityType).WithTransaction(_uow?.GetOrBeginTransaction()); if (_db.Options.NoneParameter != null) update.NoneParameter(_db.Options.NoneParameter.Value); if (_db.Options.EnableGlobalFilter == false) update.DisableGlobalFilter(); - if (entitys != null) - { - (update as UpdateProvider)._source.AddRange(entitys.Where(a => a != null)); //防止 Aop.AuditValue 触发两次 - if (_db.Options.AuditValue != null) - foreach (var item in entitys) - _db.Options.AuditValue(new DbContextAuditValueEventArgs(Aop.AuditValueType.Update, _table.Type, item)); - } + if (entitys != null) (update as UpdateProvider)._source.AddRange(entitys.Where(a => a != null)); //防止 Aop.AuditValue 触发两次 return update; } protected virtual IDelete OrmDelete(object dywhere) @@ -232,14 +215,19 @@ namespace FreeSql /// 附加实体,可用于不查询就更新或删除 /// /// - public void Attach(TEntity data) => AttachRange(new[] { data }); - public void AttachRange(IEnumerable data) + public void Attach(TEntity data) => AttachPriv(new[] { data }, true); + public void AttachRange(IEnumerable data) => AttachPriv(data, true); + void AttachPriv(IEnumerable data, bool isAuditValue) { if (data == null || data.Any() == false) return; if (_table.Primarys.Any() == false) throw new Exception(DbContextStrings.CannotAttach_EntityHasNo_PrimaryKey(_db.OrmOriginal.GetEntityString(_entityType, data.First()))); foreach (var item in data) { - FreeSql.Internal.CommonProvider.UpdateProvider.AuditDataValue(this, item, _db.OrmOriginal, _table, null); //与 CanUpdate 同步 + if (isAuditValue) + { + FreeSql.Internal.CommonProvider.UpdateProvider.AuditDataValue(this, item, _db.OrmOriginal, _table, null); //与 CanUpdate 同步 + _db.Options.AuditValue?.Invoke(new DbContextAuditValueEventArgs(Aop.AuditValueType.Update, _table.Type, item)); + } var key = _db.OrmOriginal.GetEntityKeyString(_entityType, item, false); if (string.IsNullOrEmpty(key)) throw new Exception(DbContextStrings.CannotAttach_PrimaryKey_NotSet(_db.OrmOriginal.GetEntityString(_entityType, item))); @@ -342,6 +330,7 @@ namespace FreeSql return false; } FreeSql.Internal.CommonProvider.InsertProvider.AuditDataValue(this, data, _db.OrmOriginal, _table, null); + _db.Options.AuditValue?.Invoke(new DbContextAuditValueEventArgs(Aop.AuditValueType.Insert, _table.Type, data)); var key = _db.OrmOriginal.GetEntityKeyString(_entityType, data, true); if (string.IsNullOrEmpty(key)) { @@ -407,6 +396,7 @@ namespace FreeSql return false; } FreeSql.Internal.CommonProvider.UpdateProvider.AuditDataValue(this, data, _db.OrmOriginal, _table, null); + _db.Options.AuditValue?.Invoke(new DbContextAuditValueEventArgs(Aop.AuditValueType.Update, _table.Type, data)); var key = _db.OrmOriginal.GetEntityKeyString(_entityType, data, false); if (string.IsNullOrEmpty(key)) { diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 53eee530..68a7753d 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -55,7 +55,7 @@ namespace FreeSql IncrAffrows(1); _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = data, Type = DbContext.EntityChangeType.Insert }); - Attach(data); + AttachPriv(new[] { data }, false); if (_db.Options.EnableCascadeSave) await AddOrUpdateNavigateAsync(data, true, null, cancellationToken); } @@ -66,7 +66,7 @@ namespace FreeSql _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = newval, Type = DbContext.EntityChangeType.Insert }); IncrAffrows(1); _db.OrmOriginal.MapEntityValue(_entityType, newval, data); - Attach(newval); + AttachPriv(new[] { newval }, false); if (_db.Options.EnableCascadeSave) await AddOrUpdateNavigateAsync(data, true, null, cancellationToken); } @@ -79,7 +79,7 @@ namespace FreeSql IncrAffrows(1); _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = data, Type = DbContext.EntityChangeType.Insert }); - Attach(data); + AttachPriv(new[] { data }, false); if (_db.Options.EnableCascadeSave) await AddOrUpdateNavigateAsync(data, true, null, cancellationToken); return; @@ -88,7 +88,7 @@ namespace FreeSql } } EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data)); - Attach(data); + AttachPriv(new[] { data }, false); if (_db.Options.EnableCascadeSave) await AddOrUpdateNavigateAsync(data, true, null, cancellationToken); } @@ -123,7 +123,7 @@ namespace FreeSql foreach (var s in data) _db.OrmOriginal.MapEntityValue(_entityType, rets[idx++], s); IncrAffrows(rets.Count); - AttachRange(rets); + AttachPriv(rets, false); if (_db.Options.EnableCascadeSave) foreach (var item in data) await AddOrUpdateNavigateAsync(item, true, null, cancellationToken); @@ -141,7 +141,7 @@ namespace FreeSql //进入队列,等待 SaveChanges 时执行 foreach (var item in data) EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item)); - AttachRange(data); + AttachPriv(data, false); if (_db.Options.EnableCascadeSave) foreach (var item in data) await AddOrUpdateNavigateAsync(item, true, null, cancellationToken); diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index c0fc2921..60131914 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -54,7 +54,7 @@ namespace FreeSql IncrAffrows(1); _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = data, Type = DbContext.EntityChangeType.Insert }); - Attach(data); + AttachPriv(new[] { data }, false); if (_db.Options.EnableCascadeSave) AddOrUpdateNavigate(data, true, null); } @@ -65,7 +65,7 @@ namespace FreeSql _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = newval, Type = DbContext.EntityChangeType.Insert }); IncrAffrows(1); _db.OrmOriginal.MapEntityValue(_entityType, newval, data); - Attach(newval); + AttachPriv(new[] { newval }, false); if (_db.Options.EnableCascadeSave) AddOrUpdateNavigate(data, true, null); } @@ -78,7 +78,7 @@ namespace FreeSql IncrAffrows(1); _db.OrmOriginal.SetEntityValueWithPropertyName(_entityType, data, _tableIdentitys[0].CsName, idtval); _db._entityChangeReport.Add(new DbContext.EntityChangeReport.ChangeInfo { EntityType = _entityType, Object = data, Type = DbContext.EntityChangeType.Insert }); - Attach(data); + AttachPriv(new[] { data }, false); if (_db.Options.EnableCascadeSave) AddOrUpdateNavigate(data, true, null); return; @@ -87,7 +87,7 @@ namespace FreeSql } } EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(data)); - Attach(data); + AttachPriv(new[] { data }, false); if (_db.Options.EnableCascadeSave) AddOrUpdateNavigate(data, true, null); } @@ -126,7 +126,7 @@ namespace FreeSql foreach (var s in data) _db.OrmOriginal.MapEntityValue(_entityType, rets[idx++], s); IncrAffrows(rets.Count); - AttachRange(rets); + AttachPriv(rets, false); if (_db.Options.EnableCascadeSave) foreach (var item in data) AddOrUpdateNavigate(item, true, null); @@ -144,7 +144,7 @@ namespace FreeSql //进入队列,等待 SaveChanges 时执行 foreach (var item in data) EnqueueToDbContext(DbContext.EntityChangeType.Insert, CreateEntityState(item)); - AttachRange(data); + AttachPriv(data, false); if (_db.Options.EnableCascadeSave) foreach (var item in data) AddOrUpdateNavigate(item, true, null); diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext2/AggregateRootRepositoryTest2.cs b/FreeSql.Tests/FreeSql.Tests.DbContext2/AggregateRootRepositoryTest2.cs index 448fced1..aa3b6183 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext2/AggregateRootRepositoryTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext2/AggregateRootRepositoryTest2.cs @@ -21,6 +21,51 @@ namespace FreeSql.Tests.DbContext2 public override ISelect Select => base.SelectDiy; } + [Fact] + public void Test41() + { + using (var fsql = g.CreateMemory()) + { + var repo = fsql.GetRepository(); + repo.DbContextOptions.AuditValue += e => + { + if (e.Object is Test4Id item) + { + item.Id = new Random().Next(); + } + }; + var item = new Test4Id { Id = 0 }; + repo.Insert(item); + Assert.True(item.Id > 0); + + } + } + [Fact] + public void Test40() + { + using (var fsql = g.CreateMemory()) + { + fsql.Aop.AuditValue += (s, e) => + { + if (e.Object is Test4Id item) + { + item.Id = new Random().Next(); + e.ObjectAuditBreak = true; + } + }; + var repo = fsql.GetRepository(); + var item = new Test4Id { Id = 0 }; + repo.Insert(item); + Assert.True(item.Id > 0); + + } + } + class Test4Id + { + public int Id { get; set; } + public string Field2 { get; set; } + } + [Fact] public void Test3() { diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 5830ec40..44d4f9e4 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1087,6 +1087,93 @@ + + + 动态创建实体类型 + + + + + 配置Class + + 类名 + 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] + + + + + 获取类型构建器,可作为要构建的Type来引用 + + + + + 配置属性 + + 属性名称 + 属性类型 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性标记的特性-支持多个 + + + + + 配置属性 + + 属性名称 + 属性类型 + 该属性是否重写父类属性 + 属性默认值 + 属性标记的特性-支持多个 + + + + + 配置父类 + + 父类类型 + + + + + Override属性 + + + + + + Emit动态创建出Class - Type + + + + + + Emit动态创建出Class - Type,不附带获取TableInfo + + + + + + 首字母小写 + + + + + + + 首字母大写 + + + + 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 "" @@ -5809,6 +5896,28 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 + + + 动态构建Class Type + + + + + + 根据字典,创建 table 对应的实体对象 + + + + + + + + 根据实体对象,创建 table 对应的字典 + + + + + C#: that >= between && that <= and