当我想要更新实体时,我试图让我的头脑将一个带有相关实体的实体附加到新的上下文。
我有一个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();
}
}
由于 肖恩
答案 0 :(得分:1)
要避免这类问题,您应该GetPersonnel()
进行NoTracking
查询。
即
ctx.Person.MergeOption = MergeOption.NoTracking;
// and then query as per normal.
通过这种方式,您可以获得未附加的已连接实体(假设您使用.Include()
)的图表。请注意,如果您尝试手动分离实体,这将不起作用,因为这样做会破坏您的图形。
希望这有帮助
亚历