【发布时间】:2011-08-03 14:14:40
【问题描述】:
我使用Override Save Changes 问题中的代码在我的应用程序中实现审计。添加实体后,一切都很好。但是,当修改实体时,永远不会加载“CreatedOn”日期。
它始终为空,因此最初的“CreatedOn”日期会从数据库中删除。
我还尝试查看存储在实体中的 OriginalValues 集合,它是为“ModifiedOn”日期而不是“CreatedOn”日期填充的。这两个字段都填充在数据库中...为什么一个由 EF 加载而一个不加载?
public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<IAuditable>();
if (changeSet != null)
{
foreach (DbEntityEntry<IAuditable> entry in changeSet)
{
switch (entry.State)
{
case EntityState.Added:
entry.Entity.CreatedOn = DateTime.Now;
entry.Entity.ModifiedOn = DateTime.Now;
break;
case EntityState.Modified:
entry.Entity.ModifiedOn = DateTime.Now;
//entry.Entity.CreatedOn date always null here
break;
}
}
}
return base.SaveChanges();
}
【问题讨论】:
-
您找到解决方案了吗?今天我遇到了几乎和你一样的问题,只是在我的情况下,
UpdatedBy/UpdatedById为空。有趣的是,UpdatedOn工作得很好,即使当我检查 SSMS 中的行时,UpdatedOn或UpdatedById都不是 NULL。我想知道审计字段是否以某种方式相互冲突,前提是它们都指向同一个实体...... -
我从来没有找到解决方案 - 我最终在保存之前从数据库中重新加载了创建的日期。进行额外的数据库调用并不理想,但它可以工作。
-
昨晚我一直在研究这个,发现是 DBSet.Remove(entity) 将我的属性设置为空(这甚至在调用
SaveChanges()之前)。这显然是by design,这很遗憾,因为我最终不得不将逻辑上移一层到我的存储库中。我宁愿在 DbContext 中实现软删除,因为它更干燥。无论如何感谢您的更新!
标签: ef-code-first