不能为类型 'MyTable' 的实体调用成员'CurrentValues',因为上下文中不存在该实体



我有一个使用实体框架v6.0的MVC应用程序。每当对DbContext进行更改时,我都会覆盖SaveChanges()方法并将修改记录在审核日志中。下面是审核日志记录过程的一部分代码:

public override int SaveChanges()
{
var ChangesEntities = ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted
|| e.State == EntityState.Modified
|| e.State == EntityState.Added).ToList();
foreach (DbEntityEntry entry in ChangesEntities)
{
if (entry.State == EntityState.Modified)
{
SetCorrectOriginalValues(entry);
}
...
}
...
return base.SaveChanges();
}
void SetCorrectOriginalValues(DbEntityEntry Modified)
{
var values = Modified.CurrentValues.Clone();
Modified.Reload();
Modified.CurrentValues.SetValues(values);
Modified.State = EntityState.Modified;
}

此代码通常有效,但是,当我尝试进行特定更新时,出现以下错误:

异常消息:

Member 'CurrentValues' cannot be called for the entity of type 'MyTable' because the
entity does not exist in the context.
To add an entity to the context call the Add or Attach method of DbSet.

异常堆栈跟踪:

at System.Data.Entity.Internal.InternalEntityEntry.get_CurrentValues()
at System.Data.Entity.Infrastructure.DbEntityEntry.get_CurrentValues()
at MyDatabaseName.DataLibrary.MyDatabaseEntities
.SetCorrectOriginalValues(DbEntityEntry Modified)
at MyDatabaseName.DataLibrary.MyDatabaseEntities.SaveChanges()
...

异常消息是什么意思?什么时候以及为什么CurrentValues不能被召唤?实体在上下文中不存在是什么意思?

在扩展DbContext的MyDatabaseEntities.Context.cs中,"MyTable"似乎存在:

public virtual DbSet<MyTable> MyTables { get; set; }

我检查了实体框架模型图,那里存在"MyTable"。

多亏了上面评论中给出的指针,我能够找到错误的来源,并找出触发错误的原因。基本答案是,这是由并发问题引起的。我正在尝试更新已在上一次调用中删除的MyTable对象。

在我的网页上,我有一个MyTable对象的表:

ID   | Name | Delete Button
---- | ---- | -------------
1    | abc  | button1
2    | xyz  | button2

每行都有一个删除按钮。单击按钮时,将执行以下操作:

  1. 传入要删除的对象ID
  2. 获取 HTML 表中显示的MyTable对象的列表,不包括ID设置为要删除的对象。
  3. 遍历所有对象并保存任何修改,例如对Name字段的更改。
  4. 从具有与单击的按钮对应的IDDbSet中删除MyTable对象。

在第一组操作完成之前单击第二个删除按钮时出现问题。发生这种情况时,有 2 组操作同时运行,事件的顺序如下所示:

操作 1:单击按钮 1(要删除的 ID = 1)操作 1:获取要更新的 MyTable 对象列表(包括 ID 2)操作 2:单击按钮 2(要删除的 ID = 2)操作 2:获取要更新的 MyTable 对象列表(仍包括 ID 1)操作 1:



更新所有 MyTable 对象 (ID 2)操作1
删除 ID 1
操作 2:更新所有 MyTable 对象 -错误,因为 ID 1 已被删除!

在尝试更新对象之前,我最终通过重新排列某些事件的顺序并添加检查以确保对象仍然存在于DbSet而不仅仅是 HTML 表中

来解决问题。

就我而言,问题与 AsNoTracking 有关(通常通过加载提供实体的实例,但是当我将其更改为 AsNoTracking 时,更新开始触发排除,因为交付的实体与实体框架断开连接)

相关内容

最新更新