gpt4 book ai didi

c# - Entity Framework 6(代码优先)实体版本控制和审计

转载 作者:太空狗 更新时间:2023-10-29 17:48:00 26 4
gpt4 key购买 nike

我正在考虑将 Entity Framework 6.1.1 与 SQL Server 2008 R2 结合使用。

目前,我正在使用代码优先 EF 功能创建我的模型和数据库。我的基本用例是创建一个日志,记录对特定实体的所有更改(ID 是关键列),以帮助审计员跟踪所做的所有更改以及由谁进行。例如:

|ID|Version|Created Date|Created By|Modified Date|Modified By|Modify Action| ... (rest of entity fields)
-------------------------------------------------------------------------------------------------------
| 4| 12 | 12-Mar-14 | tom | 20-Feb-15 | jack | Update |
| 4| 11 | 12-Mar-14 | tom | 14-Feb-15 | jill | Update |
| 4| 1 | 12-Mar-14 | tom | 12-Mar-14 | tom | Create |

Entity Framework 是否支持这种类型的数据库方案?如果是这样,我如何设置我的模型/解决方案来促进这一点?

我的另一种选择是拦截所有对 DbContext 上的 SaveChanges() 方法的调用,并将所有数据库更改记录到单独的 Audit 表,但这可能会使检索信息更具挑战性。

如果您能提供有关使用 SQL Server 和 EF 6 创建审计跟踪的任何帮助,我们将不胜感激。

最佳答案

我已经使用了你提到的第二种方法,通过重载 dbContext SaveChanges() 方法:

public class MyContext : DbContext
{

public int SaveChanges(int userId)
{
// Get all Added/Deleted/Modified entities (not Unmodified or Detached)
foreach (var ent in this.ChangeTracker.Entries().Where(p => p.State == EntityState.Added
|| p.State == EntityState.Deleted || p.State == EntityState.Modified))
{

foreach (AuditLog x in GetAuditRecordsForChange(ent, userId))
{
this.AuditLogs.Add(x);
}
}
return base.SaveChanges();
}
...

因此,如果我想记录一个特定的实体,我只需调用重载的 SaveChanges 并传入一个 UserId:

public void Update(StockCatalogueItem entity, int userId)
{
_context.SaveChanges(userId);
}

我还有一个定制DoNotLog我用来装饰不想记录的实体属性的属性。否则,日志记录可能会生成大量数据,因为每个实体修改都等于一个数据库条目。

[DoNotLog]
public int CreatedBy { get; set; }

GetAuditRecordsForChange方法检查任何 DoNotLog属性并返回 List<AuditLog>保存在 AuditLogs 表中:

public class AuditLog
{
public int Id { get; set; }
public int CreatedBy { get; set; }
public DateTime CreatedOn { get; set; }
public AuditEventType EventType { get; set; }
public string TableName { get; set; }
public int EntityId { get; set; }
public string ColumnName { get; set; }
public string Controller { get; set; }
public string Action { get; set; }
public string IPAddress { get; set; }
public string OriginalValue { get; set; }
public string NewValue { get; set; }
}

关于c# - Entity Framework 6(代码优先)实体版本控制和审计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28627685/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com