Asp.net mvc 执行插入时更新存储过程的ASP.NET MVC和EF引用

Asp.net mvc 执行插入时更新存储过程的ASP.NET MVC和EF引用,asp.net-mvc,entity-framework,stored-procedures,insert,Asp.net Mvc,Entity Framework,Stored Procedures,Insert,我使用存储过程在保存所有历史记录的数据库中进行插入和(逻辑)删除。不允许应用程序进行更新 我尝试插入一个新的位置记录,该记录引用一个位置记录。在调用context.Add方法之前,需要进行一些设置处理 (向右滚动查看评论) 执行后,x=Created和y=Unchanged,如预期 SaveChanges抛出一个错误,它无法找到并更新实体的存储过程。这很奇怪,因为我并没有试图更新那个表。我正在其相关表上进行插入 在正常情况下,我为表提供了一个更新存储过程,该表只记录其调用,不执行任何操作。结果是

我使用存储过程在保存所有历史记录的数据库中进行插入和(逻辑)删除。不允许应用程序进行更新

我尝试插入一个新的
位置
记录,该记录引用一个
位置
记录。在调用
context.Add方法之前,需要进行一些设置处理

(向右滚动查看评论)

执行后,
x=Created
y=Unchanged
,如预期

SaveChanges
抛出一个错误,它无法找到并更新
实体的存储过程。这很奇怪,因为我并没有试图更新那个表。我正在其相关表上进行插入

在正常情况下,我为
提供了一个更新存储过程,该表只记录其调用,不执行任何操作。结果是错误消失,但没有记录任何内容。 因此,
SaveChanges
似乎正在检查相关表是否存在更新过程,但没有调用它

我现在可以通过为每个表创建一系列更新过程并在中进行配置来解决这个问题,但我觉得这可能是一个bug,我应该在某个地方报告它

有人遇到过这样或类似的情况吗


D

我认为您遇到了由于插入断开连接的对象图而导致的问题

调用
DbFacade.db.Places.Add(place)
时,整个图形被标记为已添加,因此我希望调试器在调用
EntityState y=DbFacade.db.Entry(place.ausburbior).State之后告诉您y是
创建的
未更改

所以EF应该尝试插入
对象,
对象…所以它应该寻找一个插入过程…所以这并不能真正回答它为什么要寻找一个更新过程,是吗

麻烦!你有插入程序吗?它是否调用更新过程

无论如何,请阅读以下内容,看看是否有帮助:


谢谢您的支持。那篇文章的背景很好。读完后,我可以补充以下几点:我总是只使用一个上下文。我的DbFacade对象是一个单例ViewModel,它将上下文保持为单例上下文。我使用Id方法,而不是像本文建议的那样设置完整的AusSuburban对象,尽管我也尝试了额外的行:place.ausSuburban=mmv.AusSuburbMgr.Goto(place.aussuburbIdentit);再次-place.ausburbitor=mmv.AusSuburbMgr.Goto(place.AusSuburbIdent);insert sp实际上是一个“save”sp,可以为update或insert调用它,但我选择仅将其用作insert,而不在应用程序中进行任何更新。
[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");
}