Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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
.net 实体框架:插入时出错_.net_Vb.net_Entity Framework_Visual Studio 2013 - Fatal编程技术网

.net 实体框架:插入时出错

.net 实体框架:插入时出错,.net,vb.net,entity-framework,visual-studio-2013,.net,Vb.net,Entity Framework,Visual Studio 2013,我在尝试使用EF插入时遇到问题。情况如下: 当我创建一个新的注册表时,我做了一个普通的插入,其中一个PK从SQL接收到MAX函数的返回 然后我从数据库中删除了这一行,没有EF 最后,我尝试使用EF插入一个新的注册表,就像我在步骤1中所做的那样 然后,我从Visual Studio收到以下消息: 已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext可能处于不一致的状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的

我在尝试使用EF插入时遇到问题。情况如下:

当我创建一个新的注册表时,我做了一个普通的插入,其中一个PK从SQL接收到MAX函数的返回 然后我从数据库中删除了这一行,没有EF 最后,我尝试使用EF插入一个新的注册表,就像我在步骤1中所做的那样 然后,我从Visual Studio收到以下消息:

已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext可能处于不一致的状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的

为了说明我的问题,我做了一个例子

如何解决此问题?

最初检索实体时,请尝试使用AsNoTracking:

using (var context = new MyContext())
{
    var myEntities = context.MyEntities.AsNoTracking();

    // then you can manually delete a row in the database
    // and insert it again here in code

    context.SaveChanges();
}

这样,ObjectContext就不会缓存实体。请注意,这将影响依赖于跟踪机制的代码区域(如果有)。

如果在步骤2和步骤3之间停止程序并重新启动,会发生什么情况?在这种情况下,fineEntity Framework会在加载实体时在内存中保留实体的副本。因此,如果已经加载了实体,并且删除了数据库中的一行,那么内存中仍然有一个副本。现在,当您尝试插入一个实体时,EF发现内存中已经存在一个具有相同键的现有对象,即使它已经在db中被删除,并抛出一个错误。这就是为什么我要求在步骤2和步骤3之间停止并启动它-想测试这个理论这正是我的问题@OJRaqueño。我昨天工作了一整天,仍然没有找到解决办法。谢谢@OJRaqueño的帮助。我一整天都在尝试你的解决方案,有几种方法,但都不管用。然后我继续寻找答案,直到找到这个。我开始认为,除了重构我所有的数据库,这个问题没有解决办法。但这一解决方案的成本确实很高。你有没有其他想法让我试试?