MVC实体框架从表中获取KEY属性

时间:2014-07-16 07:54:14

标签: asp.net-mvc database entity-framework audit

我正在尝试从表中提取[key]值。

这是一种记录方法,如下所示:

private List<Log> GetAuditRecordsForChange(DbEntityEntry dbEntry, string userId)
{
    List<Log> result = new List<Log>();

    DateTime changeTime = DateTime.Now;

    // Get the Table() attribute, if one exists
    TableAttribute tableAttr = dbEntry.Entity.GetType().GetCustomAttributes(typeof(TableAttribute), false).SingleOrDefault() as TableAttribute;

    // Get table name (if it has a Table attribute, use that, otherwise get the pluralized name)
    string tableName = tableAttr != null ? tableAttr.Name : dbEntry.Entity.GetType().Name;

    // Get primary key value
    string keyName = dbEntry.Entity.GetType().GetProperties().Single(p => p.GetCustomAttributes(typeof(KeyAttribute), false).Count() > 0).Name;

    if (dbEntry.State == EntityState.Added)
    {
        result.Add(new Log()
        {
            LogID = Guid.NewGuid(),
            EventType = "A", // Added
            TableName = tableName,
            RecordID = dbEntry.CurrentValues.GetValue<object>(keyName).ToString(), 
            ColumnName = "*ALL",
            NewValue = (dbEntry.CurrentValues.ToObject() is IDescribableEntity) ? (dbEntry.CurrentValues.ToObject() as IDescribableEntity).Describe() : dbEntry.CurrentValues.ToObject().ToString(),
            Created_by = userId,
            Created_date = changeTime
        }
            );
    }

问题是在添加记录时获取RecordID,当删除或修改记录时它会起作用。 (获得它的代码是相同的)

当我调试时,我也看到它在CustomAttributes基础中有KeyAttribute,但不确定为什么它总是显示为0。

我可以根据需要调试更多

2 个答案:

答案 0 :(得分:0)

保存更改后,您可以获取新创建的密钥。 (猜猜密钥是自动生成插入新记录的。)

答案 1 :(得分:0)

对我来说,你有几个解决方案。

第一个解决方案:

  • 从上下文中添加实体
  • 的SaveChanges
  • 枚举登记的实体以添加日志
  • 的SaveChanges

问题(或不存在)是业务和日志记录不在同一事务中。

另一个问题,取决于实现,是为了防止记录日志日志的日志...这可以通过按类型名称过滤实体来实现。

其他解决方案:

add and ICollection&lt; Log&gt;到你的实体。

这里的问题是统一日志:

  • 实体的继承,或
  • 几个日志表+一个视图
  • ...

其他解决方案

在数据库级别使用触发器

其他解决方案

...,如果您有Sql Server Enterprise Edition,请使用cdc