我正在尝试从表中提取[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。
我可以根据需要调试更多
答案 0 :(得分:0)
保存更改后,您可以获取新创建的密钥。 (猜猜密钥是自动生成插入新记录的。)
答案 1 :(得分:0)
对我来说,你有几个解决方案。
第一个解决方案:
问题(或不存在)是业务和日志记录不在同一事务中。
另一个问题,取决于实现,是为了防止记录日志日志的日志...这可以通过按类型名称过滤实体来实现。
其他解决方案:
add and ICollection&lt; Log&gt;到你的实体。
这里的问题是统一日志:
其他解决方案
在数据库级别使用触发器
其他解决方案
...,如果您有Sql Server Enterprise Edition,请使用cdc