我正在使用ef 4.3.1,我在上下文上覆盖了savechanges(),以便我可以获取对象及其状态的列表,并在审核中创建条目日志表。我需要将记录的ID存储在审核日志表中,以便我对其进行引用。插入记录时,这是一个问题,因为我在保存之前无法访问它。当时有什么方法可以获取ID?
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
var objectStateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager;
var modifiedAuditableEntities = objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added).Where(e => (IAuditable)e.Entity != null);
foreach (var entry in modifiedAuditableEntities)
{
var entity = (IAuditable)entry.Entity;
if (entity != null)
{
switch (entry.State)
{
case EntityState.Added:
entity.IsAdded = true;
break;
case EntityState.Deleted:
entity.IsDeleted = true;
break;
case EntityState.Modified:
entity.IsModified = true;
break;
}
this.EntitySet<AuditLogEntry>().Add(this.auditLogService.CreateAuditLogEntryForEntity((IAuditable)entry.Entity));
}
return base.SaveChanges();
}
如果您的目标是您要保存,并且同时创建了审核日志,则可以将其包装在交易范围中,以便您的方法是原子。<<<<<<<<<<<<
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
using (var scope = new TransactionScope())
{
var objectStateManager = ((IObjectContextAdapter) this).ObjectContext.ObjectStateManager;
var modifiedAuditableEntities =
objectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Added).Where(
e => (IAuditable) e.Entity != null);
var result = base.SaveChanges();
foreach (var entry in modifiedAuditableEntities)
{
var entity = (IAuditable) entry.Entity;
if (entity != null)
{
switch (entry.State)
{
case EntityState.Added:
entity.IsAdded = true;
break;
case EntityState.Deleted:
entity.IsDeleted = true;
break;
case EntityState.Modified:
entity.IsModified = true;
break;
}
this.EntitySet<AuditLogEntry>().Add(
this.auditLogService.CreateAuditLogEntryForEntity((IAuditable) entry.Entity));
}
}
base.SaveChanges();
scope.Complete();
return result;
}
}
ID ID是由数据库生成的整数,在调用保存更改之前,没有任何方法可以获取它。可能的解决方案包括:
- 触发器
- 使用GUIDS作为主要密钥
- 使用数据库(NHIBERNATE中的Hilo)不管理的关键生成策略
- 首先调用base.savechanges()然后检查结果。
我建议在数据库级别使用存储过程执行您的插入/审核功能(以及其他数据库更改),并撤销从用户的插入/更新/删除权限。因此,您可以保证更新过程和审核表的完整性。