2014-04-25 54 views
0

我正在使用存儲的過程來執行插入和(邏輯)刪除數據庫中保留所有歷史記錄。應用程序的更新是不允許的。ASP.NET MVC和EF引用更新存儲過程時做插入

我試圖插入一個新的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 = Createdy = Unchanged,符合市場預期。

SaveChanges將拋出一個錯誤,指出它找不到並更新AusSuburb實體的存儲過程。這很奇怪,因爲我沒有試圖對該表進行更新。我正在對其相關表格進行插入。

在正常的絕望中,我爲AusSuburb表提供了一個更新存儲過程,它只記錄它的調用並且什麼也不做。結果是錯誤消失了,但沒有記錄。 因此,看起來SaveChanges正在檢查相關表的更新過程的存在,但不調用它。

我現在可以通過爲每個表創建一堆更新過程並配置它們來解決問題,但是我覺得這可能是一個錯誤,我應該在某處報告它。

有沒有人遇到這個或者類似的東西?

D

回答

0

我覺得你遇到了插入斷開連接的對象圖所引起的問題。

當你調用DbFacade.db.Places.Add(place),整個圖形被標記爲添加,所以我期望調試器來告訴你,y是Created調用EntityState y = DbFacade.db.Entry(place.AusSuburb).State;後不Unchanged

所以EF應該嘗試插入AusSuburb對象...所以它應該尋找一個插入過程...所以這並不真正回答爲什麼它正在尋找一個更新過程嗎?

煩!你有插入程序嗎?它是否會調用更新過程?

無論如何,閱讀,看它是否有助於:

Why does Entity Framework Reinsert Existing Objects into My Database?

+0

感謝您的支持。那篇文章是很好的背景。讀過它後,我可以添加以下內容: 我總是隻對一切使用一個上下文。我的DbFacade對象是一個單獨的ViewModel,它將上下文保持爲單例上下文。 我使用Id方法,而不是設置完整的AusSuburb對象,因爲文章推薦,儘管我也嘗試使用額外的行: place.AusSuburb = mmv.AusSuburbMgr.Goto(place.AusSuburbIdent); – decibel

+0

再次 - place.AusSuburb = mmv.AusSuburbMgr.Goto(place。AusSuburbIdent); 插入sp實際上是一個「save」sp,它可以被調用來進行更新或插入,但我選擇僅將它用作插入,並且在應用程序中沒有任何更新。 – decibel