我有一个编辑控制器操作(Httpost),代码如下:
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的多个实例不能引用实体对象。 请建议我解决它。
答案 0 :(得分:4)
以下是发生的事情:
在您的membershipService实现中,您正在查询上下文A以获取person实体。
然后在UpdatePersonEmail中将此人附加到上下文B.
有几种方法可以解决这个问题。当您在membershipServiceService类中查询上下文A时,最简单的可能是调用.AsNoTracking()。这样,服务返回的Person实体将不会附加到上下文A:
context.People.AsNoTracking().SingleOrDefault(p => p.UserName == userName);
另一种方法是使用IoC容器注入上下文,以便UpdatePersonEmail方法的类具有与membershipService类相同的上下文实例。