我使用存储过程在保存所有历史的数据库中进行插入和(逻辑)删除。不允许应用程序进行更新。
我尝试插入一个新的Place
记录,它引用了一个AusSuburb
记录。在调用context.Add
方法之前,需要进行一些设置处理。
(向右滚动查看评论)
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create( Place place)
{
place.ID = Guid.NewGuid(); // necessary Logic
place.CoreCreatingTransIdent = DbFacade.gDbFacade.Transaction.TransIdent; // necessary Logic
place.CoreCreatingUserIdent = DbFacade.gDbFacade.Transaction.UserIdent; // necessary Logic
place.CoreName = "test"; // dummy value for testing
DbFacade.db.Places.Add(place); // add the place to context control
EntityState x = DbFacade.db.Entry(place).State; // get status of place after add
EntityState y = DbFacade.db.Entry(place.AusSuburb).State; // get status of suburb after add
DbFacade.db.SaveChanges(); // save changes - throws error
return RedirectToAction("Index");
}
执行之后,如预期的那样,x = Created
和y = Unchanged
。
SaveChanges
抛出一个找不到的错误,并更新AusSuburb
实体的存储过程。这很奇怪,因为我并没有试图更新那个表。我正在插入它的相关表格。
在正常的绝望中,我为AusSuburb
表提供了一个更新存储过程,它只记录它的调用,什么也不做。结果是错误消失了,但没有任何记录。因此,SaveChanges
似乎正在检查相关表的更新过程的存在,但没有调用它
我现在可以通过为每个表创建一组更新过程并在中配置它们来解决这个问题,但我觉得这可能是一个错误,我应该在某个地方报告它。
有人遇到过这种或类似的情况吗?
D
我认为您遇到了一个由插入断开连接的对象图引起的问题。
当您调用DbFacade.db.Places.Add(place)
时,整个图都被标记为已添加,因此我希望调试器在调用EntityState y = DbFacade.db.Entry(place.AusSuburb).State;
而不是Unchanged
之后告诉您y是Created
所以EF应该尝试插入AusSuburb
对象。。。所以它应该寻找一个插入程序。。。所以这并不能真正回答它为什么要寻找更新程序,是吗?
讨厌!你有插入程序吗?它是否调用更新过程?
无论如何,读一下这个,看看它是否有帮助:
为什么实体框架将现有对象重新插入我的数据库?