Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 成员';当前值';无法为类型为';MyTable';因为上下文中不存在实体_C#_Entity Framework_Entity Framework 6_Dbcontext_Dbset - Fatal编程技术网

C# 成员';当前值';无法为类型为';MyTable';因为上下文中不存在实体

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

我有一个使用EntityFrameworkV6.0的MVC应用程序。每当对
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
  • 获取HTML表中显示的
    MyTable
    对象列表,不包括设置了要删除的
    ID
    的对象
  • 循环遍历所有对象并保存任何修改,如对
    名称
    字段的更改
  • 从具有与单击按钮对应的
    ID
    DbSet
    中删除
    MyTable
    对象
  • 在第一组操作完成之前单击第二个删除按钮时出现问题。发生这种情况时,有两组操作同时运行,事件顺序如下:

    操作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表中。

    您确定CurrentValue不包含添加到上下文中的soemthing吗,但是没有保存到db@Steve你这是什么意思?我对这些实体框架函数不是很熟悉,所以我可能只是缺少一些简单的东西。审核日志记录总是在调用
    base.SaveChanges()
    之前进行,这似乎从来都不是问题。这就是你所指的吗?你试过连接你的数据库集吗?@user3801869连接数据库集有什么作用?我应该在哪里实现呢?根据您的代码结构,如果有多个DbContext被实例化(即,每个存储库或每个服务一个DbContext),并且一个实体的实例已从一个DbContext传递到另一个DbContext,则会发生类似的情况。我怀疑在这种情况下,MyTable可能是正在保存的顶级实体上的子实体或引用?在EntityState.Distached的Modified.State上添加一个检查将是一个很好的起点,可以确定实体可能会滑入的位置。附加它应该可以解决问题,但可能值得研究它是如何做到这一点的。