2012-07-17 16 views
4

實體框架存在問題。例如,如果我們這樣做:一次性錯誤中斷實體框架的後續使用

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

,然後我們嘗試刪除已映射的誰依賴於它的子實體的實體,這是合乎邏輯的,我們得到了一個錯誤。 (當數據庫中存在依賴它的子項時,不能刪除父項)。

之後,使用新的上下文實例,執行'ParentEntity.ChildEntities.ToList()'仍然存在問題!

解決方法是重新啓動應用程序池,問題消失。

我們正在使用Autofac,並且上下文的生命週期被設置(並確認)爲每個HttpRequest,因此該錯誤在其他地方仍然存在。任何想法可以做什麼,以避免這些錯誤?

我們的猜測是objectcontext在其他地方是持久的,它將子實體的狀態存儲爲「EntityState.Deleted」,所以這與在隨後的調用中從數據庫接收的實際數據衝突。

更新:好像仔細檢查堆棧顯示,有一個懶惰的內部背景:

[DbUpdateException: An error occurred while saving entities that do not expose foreign key properties for their relationships. The EntityEntries property will return null because a single entity cannot be identified as the source of the exception. Handling of exceptions while saving can be made easier by exposing foreign key properties in your entity types. See the InnerException for details.] 
    System.Data.Entity.Internal.InternalContext.SaveChanges() +200 
    System.Data.Entity.Internal.LazyInternalContext.SaveChanges() +33 
    System.Data.Entity.DbContext.SaveChanges() +20 

也許如果我以某種方式禁用LazyInternalContext?這可以做到嗎?

+0

不「*然後... * 「的意思是:在一個新的請求(=新的上下文實例)? – Slauma 2012-07-17 14:55:24

+0

是的,新的上下文實例 – 2012-07-17 15:01:37

+0

這意味着,在新的上下文實例中加載父代和子代,然後再次刪除父代並得到相同的錯誤,對吧?如果是這樣,如果您不同時刪除這些子級,並且關聯級聯刪除處於禁用狀態,則該錯誤並不令人意外。 – Slauma 2012-07-17 15:15:46

回答

0

如果你不想要得到的異常,並通過你的自我由於某種原因使數據庫處於有效狀態,您可以通過停止驗證這樣做的:

context.Configuration.ValidateOnSaveEnabled = false; // you can put this in the constructor of your context; 
context.SaveChanges();