一个实体对象不能由 IEntityChangeTracker EF 6 的多个实例引用
本文关键字:EF 实例 引用 IEntityChangeTracker 不能 一个 实体 对象 | 更新日期: 2023-09-27 18:30:34
我正在开发MVC 5和EF 6中的应用程序。我正在使用通用方法来更新实体,并使用扩展方法来检测更改的值和属性。当我尝试插入更新的记录时,出现错误,
一个实体对象不能被多个 IEntityChangeTracker 实例引用
我的更新代码是:
public void Update(T data)
{
var originalEntity = db.Set<T>().AsNoTracking().FirstOrDefault(e => e.Id == data.Id);
var modifiedValues = originalEntity.ModifiedValues<T>(data).ToList();
for (int i = 0; i < modifiedValues.Count; i++)
{
string modifiedField = modifiedValues.ElementAt(i).Key;
string modifiedValue = modifiedValues.ElementAt(i).Value.ToString();
PropertyInfo prop = data.GetType().GetProperty(modifiedField, BindingFlags.Public | BindingFlags.Instance);
string s = prop.PropertyType.GenericTypeArguments.Select(x => x.FullName).SingleOrDefault();
switch (s)
{
case ("System.DateTime"):
{
DateTime d = Convert.ToDateTime(modifiedValue);
prop.SetValue(data, d);
break;
}
case ("System.String"):
{
prop.SetValue(data, modifiedValue);
break;
}
}
}
Insert(data); // error occurred in this function
Save();
}
插入函数的代码为:
public void Insert(T data)
{ db.Set<T>().Add(data); }
在语句 db 中。设置()。Add(data);,则发生错误。
我知道当实体已经附加到另一个上下文时会发生这种情况。但是在这些函数中,我只使用上下文对象 db 一次,但使用 AsNoTracking(),所以不应该发生此错误。
我想回答这个问题并将我的更新功能修改为:
db.Entry(data).State = EntityState.Detached;
Insert(data); // error again occurred in this function
Save();
但错误仍然发生。问题出在哪里?我该如何解决?
我从我的控制器调用更新函数:
private BaseRepository<ABC> g = new BaseRepository<ABC>();
ABC m = new ABC();
m = db.ABCs.Find(id);
m.S107 = "2";
m.D103 = DateTime.Now;
m.S36 = "awais";
g.Update(m);
您正在使用m = db.ABCs.Find(id);
,它将实体附加到上下文。
尝试将其与db.ABCs.AsNoTracking().Where(abc => abc.Id == id).First();
交换
从DbSet.Find
文档中:
。向存储区发出具有给定主数据库的实体的请求 键值和此实体(如果找到)将附加到上下文 然后回来了。...