首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架6(代码优先)实体版本控制和审计

实体框架6(代码优先)实体版本控制和审计
EN

Stack Overflow用户
提问于 2015-02-20 19:16:20
回答 3查看 13.2K关注 0票数 10

我正在考虑将Entity Framework6.1.1与SQL Server2008 R2一起使用。

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

代码语言:javascript
复制
|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创建审计跟踪的帮助都将不胜感激。

EN

回答 3

Stack Overflow用户

发布于 2015-02-20 19:29:52

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
public void Update(StockCatalogueItem entity, int userId)
{
     _context.SaveChanges(userId);
}

我还有一个自定义的DoNotLog属性,我用它来修饰我不想记录的实体属性。如果没有这一点,日志记录可能会生成大量数据,因为每次实体修改都等于一个数据库条目。

代码语言:javascript
复制
[DoNotLog]
public int CreatedBy { get; set; }

GetAuditRecordsForChange方法检查所有DoNotLog属性,并返回保存在AuditLogs表中的List<AuditLog>

代码语言:javascript
复制
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; }
    }
票数 7
EN

Stack Overflow用户

发布于 2015-02-20 19:45:26

你可以看看Entity Framework Extended。它具有审计功能,我使用该功能将实体的所有更改记录到XML中。从文档中:

审核日志功能将在实体提交到数据库时随时捕获对实体的更改。审核日志仅捕获已更改的实体以及已更改的实体的属性。记录之前和之后的值。AuditLogger.LastAudit是保存这些信息的地方,有一个ToXml()方法可以轻松地将AuditLog转换为xml以便于存储。

可以通过实体上的属性或流畅的配置AuditLog来自定义API。

更新:

自2015年起不再支持Entity Framework Extended。请参考Entity Framework Plus了解此功能。

票数 3
EN

Stack Overflow用户

发布于 2017-06-15 00:35:00

我想说,这是DDD架构中提到的事件采购模式的一个很好的候选者。你永远不会改变你的实体表,而总是插入。

这样,当您需要特定版本时,只需重放所有事件,并将它们应用于从版本0到您要查找的版本的实体。可伸缩性可以通过实体快照来解决。

第二种方法也是有效的。

参考:http://microservices.io/patterns/data/event-sourcing.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28627685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档