将具有相关实体的实体附加到新的实体框架上下文

时间:2009-07-24 10:06:20

标签: asp.net entity-framework c#-3.0 entity

当我想要更新实体时,我试图让我的头脑将一个带有相关实体的实体附加到新的上下文。

我有一个Person Table(Generalized to Personnel),它有一个LanguageID字段。该字段通过EF链接为FK,另一个表语言以LanguageID作为主键(1-M)。我需要更新特定的Persons语言首选项,但是,这个关系似乎仍然与旧的上下文相关联,因为我在下面标记的行上得到“对象不能被IEntityChangeTracker的多个实例引用”错误。有没有办法将Language实体作为人事(人)实体的关系附加到新的上下文?

实体未在原始GetPersonnel()方法中分离,该方法使用.Include()方法返回PreferredLanguage

PreferredLanguage是Person表上的NavigationProperty名称......

 public static void UpdateUser(Personnel originalUser, Personnel newUser )
    {
        using (AdminModel TheModel = new AdminModel())
        {

            ((IEntityWithChangeTracker)originalUser).SetChangeTracker(null);
            ((IEntityWithChangeTracker)originalUser.PreferredLanguage).SetChangeTracker(null);

            TheModel.Attach(originalUser);--Error Line
            TheModel.ApplyPropertyChanges("Person", newUser);

            TheModel.SaveChanges(); 
        }
    }

由于 肖恩

1 个答案:

答案 0 :(得分:1)

要避免这类问题,您应该GetPersonnel()进行NoTracking查询。

ctx.Person.MergeOption = MergeOption.NoTracking;
// and then query as per normal.

通过这种方式,您可以获得未附加的已连接实体(假设您使用.Include())的图表。请注意,如果您尝试手动分离实体,这将不起作用,因为这样做会破坏您的图形。

希望这有帮助

亚历