为什么EF不持久化新值?

本文关键字:新值 持久化 不持久 EF 为什么 | 更新日期: 2023-09-27 18:10:47

问题:为什么这段代码没有将新的摘要值持久化到数据库?如果我省略了任何周围/相关的代码,请告诉我。

细节:

我对EF的实际操作经验很少,而且我刚刚继承了一个广泛使用它的代码库。这个扩展方法在代码库中,用法如下:

public static void SafeAttachTo<T>(this ObjectContext context, string entitySetName, ref T entity) where T : IEntityWithKey {
            ObjectStateEntry entry; 
            bool attach;
            if (context.ObjectStateManager.TryGetObjectStateEntry(context.CreateEntityKey(entitySetName, entity), out entry)) {
                attach = entry.State == EntityState.Detached;
                entity = (T) entry.Entity;
            }
            else
                attach = true;
            if (attach) 
                context.AttachTo(entitySetName, entity);
        }

用法:

    public int UpdateOrInsertWidget(Widget widget) {
        if (widget.Id == 0) {
            _context.Widgets.AddObject(widget);
        } else {
            _context.SafeAttachTo("Widgets", ref widget);
            _context.ObjectStateManager.ChangeObjectState(widget, EntityState.Modified);
        }
        return _context.SaveChanges();
    }

在某个时刻,用户更改了Widget上的Summary(假设该类型具有IdSummary属性……)我们将此实例命名为changedWidget),从"Old Summary"到"New Summary"。

UpdateOrInsertWidget被这样调用:

UpdateOrInsertWidget(changedWidget);

调用_context.SaveChanges();后,数据库(SQL Server 2008)在Summary列显示"Old Summary"

entity = (T) entry.Entity;行传入时,它似乎覆盖了changedWidget,这看起来很糟糕。

但是,没有更多的EF经验,我正在努力弄清楚这段代码需要改变什么。

为什么EF不持久化新值?

我认为这里的问题是您的扩展方法只是将ObjectStateEntry设置为"Modified"状态,但ObjectStateEntry不知道已更改。

您应该使用的是ApplyOriginalValuesApplyCurrentValues,这两种方法将"分离"对象的更改应用于现有ObjectContext中的对象状态条目,并比较更改,以便ObjectContext知道哪些特定属性发生了更改。

如果你将改变的实体附加到上下文,那么你需要ApplyOriginalValues,以便上下文可以看到从原始到现在的变化。否则,您需要使用ApplyCurrentValues

您可以在这里阅读更多内容:http://msdn.microsoft.com/en-us/library/bb896248.aspx