【问题标题】:EF 4.1 Code First Detaching EntityEF 4.1 代码优先分离实体
【发布时间】:2011-11-26 22:22:03
【问题描述】:

我正在尝试将实体添加到数据库。添加后,我想将其分离,这样我就可以安全地操作对象,而无需对数据库进行任何更改。调用context.SaveChanges() 后,我执行以下操作来分离实体:

    // save
    context.Stories.Add(story);

    // attach tags. They already exists in the database    
    foreach(var tag in story.Tags)
      context.Entry(tag).State = System.Data.EntityState.Unchanged;

    context.SaveChanges();

    context.Entry(story).State = System.Data.EntityState.Detached;

但是,将实体状态更改为 DETACHED 将删除与我的实体关联的所有相关实体。有没有办法阻止这种情况?

如果我不分离实体,我的所有更改都会在我下次调用context.SaveChanges()时发送到数据库

谢谢!!

【问题讨论】:

    标签: entity-framework-4 ef-code-first


    【解决方案1】:

    没有办法。这是EF的限制。您的选择是:

    • 不使用相同的上下文进行另一次保存(单个上下文实例 = 单个保存)
    • 使用另一个不会用于保存的上下文实例再次从数据库中检索实体
    • 创建实体的深度克隆并使用克隆的实体(深度克隆通过序列化和立即反序列化完成 = 您的实体图必须是可序列化的)

    【讨论】:

    • 谢谢。我创建了实体的克隆并使用了克隆的。
    • 再次检索实体根本没有效率。使用不同的上下文也不容易。
    【解决方案2】:

    我认为有两种方法可以解决这个问题:

    • 纯粹主义者:从 DbContext 中检索实体并在不保存的情况下对其进行修改是对工具和体系结构的滥用。请改用 DTO。
    • 实用:您可以使用AsNoTracking() 检索不会被上下文跟踪以进行更改的实体图。

    【讨论】:

    • AsNoTracking() 用于检索,而不是用于添加实体。修改实体而不保存不是滥用。有时,您需要调整表示层中的值而不保存到数据库。
    • 好的,我没有正确阅读第一部分。不过,“在表示层中调整值”是 ViewModel 的用途。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2011-08-05
    相关资源
    最近更新 更多