如果对记录进行了重大更改,我已经扩展了一个类,以便将最后修改的时间戳添加到记录中。这是使用类似于this的代码完成的。
这是我的问题。 SaveChanges()
正在为两个更改触发,但第二个没有进入循环:没有检测到任何对象需要更改。
但是,记录 通过base.SaveChanges()调用由EF更新。
这是MasterTable的扩展名:
namespace AuditTestEF
{
public interface IHasAuditing
{
DateTime LastModifiedOn { get; set; }
int LastModifiedBy { get; set; }
}
public partial class MasterTable : IHasAuditing
{
}
public class AuditTestEntitiesWithAuditing : AuditTestEntities
{
public int TestingUserIs = 1;
public override int SaveChanges()
{
foreach (ObjectStateEntry entry in (this as IObjectContextAdapter)
.ObjectContext
.ObjectStateManager
.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
{
// This loop is entered the first time, but not the second
if (entry.IsRelationship) continue;
var lastModified = entry.Entity as IHasAuditing;
if (lastModified == null) continue;
lastModified.LastModifiedOn = DateTime.UtcNow;
lastModified.LastModifiedBy = TestingUserIs;
}
return base.SaveChanges();
}
}
}
这是测试工具:
[TestMethod]
public void TestMethod1()
{
MasterTable mtOriginal;
using (var audit = new AuditTestEntitiesWithAuditing())
{
var message = "Hello";
audit.TestingUserIs = 1;
mtOriginal = new MasterTable {TextField = message};
audit.MasterTable.Add(mtOriginal);
audit.SaveChanges();
// This test passes, TestingUser is set in the override
Assert.IsTrue(mtOriginal.LastModifiedBy == audit.TestingUserIs);
}
using (var audit = new AuditTestEntitiesWithAuditing())
{
var mt = audit.MasterTable.Find(mtOriginal.MasterTableId);
mt.TextField = "Goodbye";
audit.TestingUserIs = 4;
audit.SaveChanges();
// This test fails, the record is written with "Goodbye" but
// GetObjectStateEntries(EntityState.Added | EntityState.Modified) has no entries.
Assert.IsTrue(mt.LastModifiedBy == audit.TestingUserIs);
}
}
没有其他代码。实体跟踪或任何事情都没有奇怪的关闭/开启。 WYSIWYG。
我错过了什么?如何通过检查修改来错过明确修改的对象?
答案 0 :(得分:0)
Annnd ...当然,在与鸭子交谈之后回答了我自己的问题。
public override int SaveChanges()
{
ChangeTracker.DetectChanges();
这可以解决所有问题。感谢您的关注,我希望这有助于其他人。