如何从EF保存更改中获取复杂主键的原始值

时间:2018-04-05 23:06:57

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

我已经为我的所有数据库对象实现了审核日志,但由于特殊情况我遇到了问题。 我的代码类似于以下内容。

 private IEnumerable<CDMA_CHANGE_LOG> GetAuditRecords(DbEntityEntry ent, string userId, string primaryKeyId, bool updateFlag, object originalEntity)
    {
        List<CDMA_CHANGE_LOG> result = new List<CDMA_CHANGE_LOG>();
        string changeId = Guid.NewGuid().ToString();
        TableAttribute tableAttr = ent.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 entityName = tableAttr != null ? tableAttr.Name : ObjectContext.GetObjectType(ent.Entity.GetType()).Name;
        var changeTime = DateTime.UtcNow;
        if (ent.State == EntityState.Modified)
        {

            foreach (var prop in ent.OriginalValues.PropertyNames)
            {                    
                 //we cant use this because getdatabasevalues will error out when there are 2 rows in the db for this primarykey (U,A)
                //var originalValue = ent.GetDatabaseValues().GetValue<object>(prop) == null ? "" : ent.GetDatabaseValues().GetValue<object>(prop).ToString();
                var currentValue = ent.CurrentValues[prop] == null ? "" : ent.CurrentValues[prop].ToString();
                // For updates, we only want to capture the columns that actually changed
                var primaryKey = GetPrimaryKeyValue(ent);
                if (originalValue != currentValue)
                {
                    result.Add(new CDMA_CHANGE_LOG()
                    {
                        USERID = userId,
                        DATECHANGED = changeTime,
                        EVENTTYPE = "M",    // Modified
                        ENTITYNAME = entityName,
                        PRIMARYKEYVALUE = primaryKey.ToString(),
                        PROPERTYNAME = prop,
                        OLDVALUE = originalValue,
                        NEWVALUE = currentValue,
                        CHANGEID = changeId
                    });
                }
            }

        }
        return result;
    }

现在我无法使用originalValue = ent.GetDatabaseValues()。GetValue(prop),因为记录有两个字段作为主键,所以我想我可以从控制器手动查询原始值并发送为

object originalEntity

所以我想知道如何将originalEntity转换为当前实体

var originalValues = Convert.ChangeType(originalEntity, ent.GetType());

不起作用。 我发现很难得到。谢谢你的帮助。

0 个答案:

没有答案