Entity framework 4 EF 4.1代码优先分离实体

Entity framework 4 EF 4.1代码优先分离实体,entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,我正在尝试向数据库添加一个实体。一旦我添加了它,我想分离它,这样我就可以安全地操作对象,而无需对数据库做任何更改。调用context.SaveChanges()后,我执行以下操作以分离实体: // save context.Stories.Add(story); // attach tags. They already exists in the database foreach(var tag in story.Tags) context.

我正在尝试向数据库添加一个实体。一旦我添加了它,我想分离它,这样我就可以安全地操作对象,而无需对数据库做任何更改。调用
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;
但是,将实体状态更改为“分离”将删除和“我的实体”关联的所有相关实体。有没有办法阻止这一切

如果我不分离实体,下次调用
context.SaveChanges()


谢谢

没有办法。这是EF的局限性。你的选择是:

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

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

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

谢谢。我创建了实体的克隆并使用了克隆的实体。再次检索实体根本没有效率。使用不同的上下文也不容易。AsNoTracking()用于检索,而不是添加实体。修改实体而不保存不是滥用。有时,您需要在不保存到DB的情况下调整表示层中的值。好的,我没有正确阅读第一部分。不过,“在表示层中调整值”是ViewModel的用途。