无法为类型 'MyTable' 的实体调用成员 'CurrentValues',因为该实体在上下文中不存在
Member 'CurrentValues' cannot be called for the entity of type 'MyTable' because the entity does not exist in the context
我有一个使用 Entity Framework 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; }
我查看了 Entity Framework 模型图,那里存在 'MyTable'。
多亏了上面评论中的指点,我才能够找到错误的根源,并弄清楚是什么触发了错误。基本答案是这是由并发问题引起的。我正在尝试更新已在上一次调用中删除的 MyTable
对象。
在我的网页上,我有一个 table of MyTable
对象:
ID | Name | Delete Button
---- | ---- | -------------
1 | abc | button1
2 | xyz | button2
每一行都有一个删除按钮。单击按钮时,会发生以下操作:
- 传入要删除对象的
ID
。
- 获取HTML中显示的
MyTable
个对象列表table,不包括ID
设置为删除的对象。
- 遍历所有对象并保存任何修改,例如对
Name
字段的更改。
- 从
DbSet
中删除 MyTable
对象,其中 ID
对应于单击的按钮。
在第一组操作完成之前单击第二个删除按钮时出现问题。发生这种情况时,同时有 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 [=67] 中解决了这个问题=],然后尝试更新它。
我有一个使用 Entity Framework 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; }
我查看了 Entity Framework 模型图,那里存在 'MyTable'。
多亏了上面评论中的指点,我才能够找到错误的根源,并弄清楚是什么触发了错误。基本答案是这是由并发问题引起的。我正在尝试更新已在上一次调用中删除的 MyTable
对象。
在我的网页上,我有一个 table of MyTable
对象:
ID | Name | Delete Button
---- | ---- | -------------
1 | abc | button1
2 | xyz | button2
每一行都有一个删除按钮。单击按钮时,会发生以下操作:
- 传入要删除对象的
ID
。 - 获取HTML中显示的
MyTable
个对象列表table,不包括ID
设置为删除的对象。 - 遍历所有对象并保存任何修改,例如对
Name
字段的更改。 - 从
DbSet
中删除MyTable
对象,其中ID
对应于单击的按钮。
在第一组操作完成之前单击第二个删除按钮时出现问题。发生这种情况时,同时有 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 [=67] 中解决了这个问题=],然后尝试更新它。