我试图弄清楚如何让 EntityFramework 认为实体的当前状态没有改变。
我尝试这样做的原因是实体连接到一个“模板”实体(1 对 1 关系),如果当前实体的值为 null,它会从该实体继承值。
模板属性继承发生在执行 ObjectMaterialized 事件时,此时实体状态变为 EntityState.Modified。
现在将它的状态设置为 EntityState.Unchanged 不起作用(状态仍然被修改,它应该表现得像这样吗?)。我试图通过调用 Detach 和 Attach 来解决这个问题,但存在几个参考问题,因为我怀疑 Entity Framework (6 pre) 正在寻找重复的关系。
问题的根源似乎是我使用以下代码重置的字节数组属性:
var entry = context.Entry(this);
foreach(var p in entry.CurrentValues.PropertyNames.Where(p => entry.Property(p).IsModified))
{
if(entry.CurrentValues[p] is byte[])
{
entry.OriginalValues[p] = (entry.CurrentValues[p] as byte[])/*.ToArray()*/;
}
else
{
entry.OriginalValues[p] = entry.CurrentValues[p];
}
}
entry.State = EntityState.Unchanged;
当使用 entry.State 读取条目状态时,它再次变为 Modified 并且 entry.CurrentValues.PropertyNames.Where(x => entry.Property(x).IsModified) 返回一个条目:字节数组。我比较了数组,它们是相同的!我还尝试将数组的克隆分配给 OriginalValues[propertyName] 但没有成功。
我的问题是,当实体状态包含字节数组时,如何将实体状态重置为未更改,以便 EF 认为该对象是从数据库中检索到的对象与现在完全一样?