Entity framework 一个实体对象不能被多个IEntityChangeTracker实例引用
我有一个编辑控制器操作(Httpost),代码如下:Entity framework 一个实体对象不能被多个IEntityChangeTracker实例引用,entity-framework,entity-framework-4.1,Entity Framework,Entity Framework 4.1,我有一个编辑控制器操作(Httpost),代码如下: var person = membershipService.GetPersonByUserName(userName, out userAccount); if (!email.Equals(person.Email)) { person.Email = email; CRRep.UpdatePersonEmail(pe
var person = membershipService.GetPersonByUserName(userName, out userAccount);
if (!email.Equals(person.Email)) {
person.Email = email;
CRRep.UpdatePersonEmail(person);
}
public void UpdatePersonEmail(Person person)
{
try
{
context.Entry(person).State = System.Data.EntityState.Modified;
context.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
}
}
}
}
但我得到了以下错误:
一个实体对象不能被多个IEntityChangeTracker实例引用。
请给我建议解决方案。以下是发生的情况: 在membershipService实现中,您正在查询上下文以获取person实体 然后在UpdatePersonEmail中,您将此人附加到上下文B 有几种方法可以解决这个问题。最简单的方法可能是在membershipService类中查询上下文时调用.AsNoTracking()。这样,服务返回的Person实体将不会附加到上下文:
context.People.AsNoTracking().SingleOrDefault(p => p.UserName == userName);
另一种方法是使用IoC容器注入上下文,以便UpdatePersonEmail方法的类和membershipService类具有相同的上下文实例 下面是正在发生的事情: 在membershipService实现中,您正在查询上下文以获取person实体 然后在UpdatePersonEmail中,您将此人附加到上下文B 有几种方法可以解决这个问题。最简单的方法可能是在membershipService类中查询上下文时调用.AsNoTracking()。这样,服务返回的Person实体将不会附加到上下文:
context.People.AsNoTracking().SingleOrDefault(p => p.UserName == userName);
另一种方法是使用IoC容器注入上下文,以便UpdatePersonEmail方法的类和membershipService类具有相同的上下文实例 您如何实例化和处理
上下文
?每个请求有一个上下文,每个请求有多个上下文,还是每个请求有一个上下文?我有一个上下文用于所有请求。@Slauma如果有多个上下文,我如何处理上下文。如何修改此代码?您可能在上下文生存期和多个上下文中遇到了麻烦。据我所知,该错误表明您正试图将一个实体附加到一个上下文,但它已经附加到另一个上下文(可能来自前一个请求?)。你能告诉我你是怎么做的,在哪里做的吗?处置基本上应该发生在“同一级别”=服务、控制器、应用程序或任何级别。@Slauma我在存储库的顶部创建它,如下所示:公共类UserAccountRepository{CreditRegistryContext=new CreditRegistryContext();而UpdatePersonEmail位于该存储库类的底部。如何实例化和处理上下文
?每个请求有一个上下文,每个请求有多个上下文,还是每个请求有一个上下文?所有请求都有一个上下文。@Slauma如果有多个上下文,我如何处理上下文。如何修改此代码?你知道吗可能上下文生存期和多个上下文比较混乱。据我所知,错误表明您正试图将一个实体附加到一个上下文,但它已经附加到另一个上下文(可能来自前一个请求?)。您能说明如何以及在何处执行“新上下文…”处理基本上应该发生“在同一级别”=服务、控制器、应用程序或任何级别。@Slauma我在存储库的顶部创建它,如下所示:公共类UserAccountRepository{CreditRegistryContext=new CreditRegistryContext();UpdatePersonEmail位于存储库类的底部