C# 成员';当前值';无法为类型为';MyTable';因为上下文中不存在实体
我有一个使用EntityFrameworkV6.0的MVC应用程序。每当对C# 成员';当前值';无法为类型为';MyTable';因为上下文中不存在实体,c#,entity-framework,entity-framework-6,dbcontext,dbset,C#,Entity Framework,Entity Framework 6,Dbcontext,Dbset,我有一个使用EntityFrameworkV6.0的MVC应用程序。每当对DbContext进行更改时,我都会覆盖SaveChanges()方法,并将修改记录在审核日志中。以下是部分审核日志记录过程的代码: public override int SaveChanges() { var ChangesEntities=ChangeTracker.Entries()。其中(e=>e.State==EntityState.Deleted ||e.State==EntityState.Modified
DbContext
进行更改时,我都会覆盖SaveChanges()
方法,并将修改记录在审核日志中。以下是部分审核日志记录过程的代码:
public override int SaveChanges()
{
var ChangesEntities=ChangeTracker.Entries()。其中(e=>e.State==EntityState.Deleted
||e.State==EntityState.Modified
||e.State==EntityState.Added).ToList();
foreach(ChangesEntities中的DbEntityEntry)
{
if(entry.State==EntityState.Modified)
{
SetCorrectoryOriginalValues(条目);
}
...
}
...
返回base.SaveChanges();
}
void SetCorrectoryOriginalValues(DbEntityEntry已修改)
{
var values=Modified.CurrentValues.Clone();
修改的.Reload();
修改的.CurrentValues.SetValues(值);
Modified.State=EntityState.Modified;
}
此代码通常有效,但是,当我尝试进行特定更新时,会出现以下错误:
异常消息:
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()
...
无法为“MyTable”类型的实体调用成员“CurrentValues”,因为
上下文中不存在实体。
要向上下文添加实体,请调用DbSet的add或Attach方法。
异常堆栈跟踪:
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
何时以及为什么不能被调用?什么是实体在上下文中不存在的意思
在MyDatabaseEntities.Context.cs中,它扩展了DbContext
,“MyTable”似乎存在:
公共虚拟数据库集MyTables{get;set;}
我检查了实体框架模型图,并且“MyTable”存在于该图中。多亏了上面评论中给出的指针,我能够找到错误的来源,并找出触发错误的原因。基本答案是,这是由并发问题引起的。我试图更新一个
MyTable
对象,该对象在上一次调用中已被删除
在我的网页上,我有一个包含MyTable
对象的表:
ID | Name |删除按钮
---- | ---- | -------------
1 | abc |按钮1
2 | xyz |按钮2
每行有一个删除按钮。单击按钮时,会发生以下操作:
ID
李>
MyTable
对象列表,不包括设置了要删除的ID
的对象名称
字段的更改ID
的DbSet
中删除MyTable
对象操作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表中。您确定CurrentValue不包含添加到上下文中的soemthing吗,但是没有保存到db@Steve你这是什么意思?我对这些实体框架函数不是很熟悉,所以我可能只是缺少一些简单的东西。审核日志记录总是在调用base.SaveChanges()
之前进行,这似乎从来都不是问题。这就是你所指的吗?你试过连接你的数据库集吗?@user3801869连接数据库集有什么作用?我应该在哪里实现呢?根据您的代码结构,如果有多个DbContext被实例化(即,每个存储库或每个服务一个DbContext),并且一个实体的实例已从一个DbContext传递到另一个DbContext,则会发生类似的情况。我怀疑在这种情况下,MyTable可能是正在保存的顶级实体上的子实体或引用?在EntityState.Distached的Modified.State上添加一个检查将是一个很好的起点,可以确定实体可能会滑入的位置。附加它应该可以解决问题,但可能值得研究它是如何做到这一点的。