我有两个表(表a和表B(,它们之间有一个桥接表。我已经为两者正确设置了实体,包括多对多关系的导航属性。这两个实体都扩展了一个"AuditBase"类,该类包括"Modified/Created Date和ModifiedBy/CreatedBy User"。
使用提交方法,将自动更新扩展"AuditBase"并处于"已创建/已修改"状态的任何实体的此审核信息。
目前,我在某些Save方法中有代码,当通过导航属性从多对多关系中添加/删除项时,可以手动将TableB的实体设置为"已修改"。这样,即使表B中没有任何实际更改,审计数据也会自动更新。
我可以继续使用这种模式,但我想看看是否有办法删除检查桥接表更新的手动步骤。在调用Save(在我的提交方法中(之前,有没有任何方法可以检测到此Bridge表的挂起更改,并将关联的实体标记为已修改?
有关桥接表的配置-
this.HasMany(u => u.TableA)
.WithMany(r => r.TableB)
.Map(m =>
{
m.ToTable("TableA_TableB", "dbo");
m.MapLeftKey("TableA_Id");
m.MapRightKey("TableB_Id");
});
这是现在用来查找修改实体的代码-
this._context.ChangeTracker.DetectChanges();
var addedAuditedEntities =
this._context.ChangeTracker.Entries<AuditModelBase>().Where(p => p.State ==
EntityState.Added).Select(p => p.Entity);
var modifiedAuditedEntities =
this._context.ChangeTracker.Entries<AuditModelBase>().Where(p => p.State ==
EntityState.Modified).Select(p => p.Entity);
您没有提供任何示例代码,但您可以覆盖SaveChanges
方法并控制相关的实体状态。
像这样的东西。例如
public class AppDbContext : DbContex
....
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var modifiled = ChangeTracker.Entries<BRIDGE_TABLE_ENTITY>().Where(x => x.State == EntityState.Added || x.State == EntityState.Deleted || x.State == EntityState.Modified);
foreach (var item in modifiled)
{
item.Property("TABLEA_REF_PROP_NAME").EntityEntry.State = EntityState.Modified;
item.Property("TABLEB_REF_PROP_NAME").EntityEntry.State = EntityState.Modified;
}
ChangeTracker.AutoDetectChangesEnabled =
false; // for performance reasons, to avoid calling DetectChanges() again.
var result = base.SaveChanges();
ChangeTracker.AutoDetectChangesEnabled = true;
return result;
}
更新
根据您的示例代码,简短的答案是如果您需要将ChangeTracker
用于桥接表,则必须创建一个单独的实体来提供对它的访问