.net 实体框架:插入时出错
我在尝试使用EF插入时遇到问题。情况如下: 当我创建一个新的注册表时,我做了一个普通的插入,其中一个PK从SQL接收到MAX函数的返回 然后我从数据库中删除了这一行,没有EF 最后,我尝试使用EF插入一个新的注册表,就像我在步骤1中所做的那样 然后,我从Visual Studio收到以下消息: 已成功提交对数据库的更改,但更新对象上下文时出错。ObjectContext可能处于不一致的状态。内部异常消息:AcceptChanges无法继续,因为对象的键值与ObjectStateManager中的另一个对象冲突。在调用AcceptChanges之前,请确保键值是唯一的 为了说明我的问题,我做了一个例子 如何解决此问题?最初检索实体时,请尝试使用AsNoTracking:.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中的
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的帮助。我一整天都在尝试你的解决方案,有几种方法,但都不管用。然后我继续寻找答案,直到找到这个。我开始认为,除了重构我所有的数据库,这个问题没有解决办法。但这一解决方案的成本确实很高。你有没有其他想法让我试试?