EF 4.1 Code First Detaching Entity

时间:2011-11-26 07:31:34

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

我正在尝试向DB添加实体。一旦我添加它,我想分离它,所以我可以安全地操纵对象而不需要对DB进行任何更改。在调用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将删除与my实体关联的所有相关实体。有办法阻止这个吗?

如果我不分离实体,我下次拨打context.SaveChanges()时会将所有更改发送到数据库

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

  • Purist:从DbContext中检索实体并在不保存的情况下修改它们是对工具和体系结构的误用。改为使用DTO。
  • 务实:您可以使用AsNoTracking()检索实体图,该图不会被更改的上下文跟踪。