1

我试图弄清楚如何让 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 认为该对象是从数据库中检索到的对象与现在完全一样?

4

2 回答 2

2

ObjectStatemanager 仅记录项目是否已更改。它不反映条目是否与数据库中的相同,即不涉及魔法。

尝试类似:

ObjectStateEntry state = context.ObjectStateManager.GetObjectStateEntry(entity);
state.ChangeState(EntityState.Unchanged);
于 2013-10-23T13:39:23.503 回答
0

实际上 EntityFramework 跟踪所有修改的属性,但似乎 byte[] 是一个例外,它只是不可逆转地标记为已更改。我找到了一篇关于 EF 跟踪的文章:http ://code.msdn.microsoft.com/How-to-undo-the-changes-in-00aed3c4 我完全不更改 byte[] 属性解决了这个问题(我可以负担得起,因为这些仅用于序列化,可以推迟到实际保存到数据库发生)而不是更改,仅将对象标记为已修改,这对工作来说似乎是:

                if(context.Entry(o).State == EntityState.Unchanged)
                {
                    context.Entry(o).State = EntityState.Modified;
                }
于 2013-11-15T11:41:17.817 回答