2009-12-26 39 views
0

我是新來的實體框架。 一週之前,我遇到了當前上下文的常見問題,如果以非獨特的方式使用,會引發異常,但這是固定的。奇怪的約束與實體框架異常

今天我有一個新問題,一個真正新的問題,因爲我不知道爲什麼會發生這種情況,因爲我確實認爲我有相同的代碼。

這裏是我得到的錯誤:

Entities in 'Entities.WSUser_Detail' participate in 
the 'FK_WSUser_Detail_WSCountry' relationship. 
0 related 'WSCountry' were found. 1 'WSCountry' is expected. 

爲何如此奇怪這個錯誤是,在我的代碼我從來沒有引用任何WSUser_Detail對象。 有沒有人想出這種錯誤? 我的代碼是非常簡單的:在調用SaveChanges()

絕對沒有WSUser_Detail被稱爲在我的代碼發生

newUser = (from user in GB.Context.WSUsers 
       where user.IDUser == nFound 
       select user).FirstOrDefault(); 

newUser.DoNotSend = false; 
newUser.IP = Request.UserHostAddress; 
newUser.LastDtActivity = DateTime.Now; 
newUser.Language1 = GB.User.Language; 
newUser.LastVersion = sVersion; 
newUser.FlushNextTime = false; 

GB.Context.SaveChanges(); 

的錯誤...所以我不知道他爲什麼要問這是一個參考一個永遠不會被調用的對象(但存在於實體上下文中)。

有什麼想法?

奇怪的是,即使代碼似乎沒有改變,我也沒有這個問題。

我更新了Model.edmx以確保它不是原因,但它仍然不起作用,我已經檢查了很多次,並且由於沒有任何WSUser_Detail對象,所以錯誤不應該發生。

+0

我也測試過創建一個空白頁面,裏面只有這個代碼,並且它失敗時有相同的約束異常: using System; using System.Collections.Generic;使用System.Linq的 ; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; 使用palarcdbModel; 公共部分類AS_Default2:System.Web.UI.Page { 保護無效的Page_Load(對象發件人,EventArgs的) { WSUser X =新WSUser(); x.Email =「[email protected]」; x.Language =「fr」; GB.Context.AddToWSUsers(x); GB.Context.SaveChanges(); } } 任何想法? – Micael 2009-12-26 06:20:57

+2

更新你的問題,不要只是添加評論。 – 2009-12-26 06:23:17

回答

1

在數據庫級別,我猜測你對一個不允許爲NULL的字段有一個外鍵約束,並且你得到的模型在WSCountry和WSUser表之間有關係。

它看起來像你可能試圖挽救無效的實體 - 一個不符合您的約束..

我的猜測是,你WSUser需要有一個WSCountry實體集。是否有WSUser.WSCountry屬性設置?

如果我的預感是正確的 - 確保這是在保存之前設置的。

順便說一句 - 'FK_WSUser_Detail_WSCountry'不建議一個對象 - 它指的是在數據庫中建立的關係/ FK約束。實體框架使用這些約束來猜測您的實體應該如何關聯。

+0

感謝您的回答。我知道這是由於NULL值造成的,也可能是由於關係失敗造成的,但正如我在帖子中所說的,WSUser和WSCountry之間沒有這種聯繫。 這就是爲什麼這對我來說很奇怪......這個錯誤以前沒有發生過,我不知道發生了什麼變化,但WSUser表和WSCountry之間仍然沒有任何聯繫。沒有任何數據庫關係被改變,唯一可能失敗的是代碼,但在我的情況下,代碼不應該失敗,因爲我沒有碰到需要引用WSCountry的entitiy對象。 – Micael 2009-12-27 06:22:16

+0

也許你可以發表一些關於你的實體模型結構的更多細節 - 如果不知道你有什麼,很難猜測。 有像User-> UserDetail-> Country這樣的實體嗎? – markt 2009-12-27 20:02:21

1

使用這個檢查sys系統目錄視圖的小SQL腳本,您應該能夠找出哪個數據庫約束位於哪兩個表(及其列)涉及這個問題 - 檢查出來,很可能這是一個必需的參考,例如你不能把它留空(你現在可能在你的代碼中)。

SELECT 
    fk.name , 
    t1.Name 'Parent table', 
    c1.Name 'Parent column', 
CASE WHEN c1.is_nullable = 0 THEN 'No' ELSE 'Yes' 
END AS 'Parent column nullable', 
    t2.Name 'Referenced table', 
    c2.Name 'Referenced column' 
FROM 
    sys.foreign_keys fk 
INNER JOIN 
    sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
INNER JOIN 
    sys.tables t1 ON fkc.parent_object_id = t1.object_id  
INNER JOIN 
    sys.tables t2 ON fkc.referenced_object_id = t2.object_id 
INNER JOIN 
    sys.columns c1 ON t1.object_id = c1.object_id AND fkc.parent_column_id = c1.column_id 
INNER JOIN 
    sys.columns c2 ON t2.object_id = c2.object_id AND fkc.referenced_column_id = c2.column_id 
WHERE 
    fk.name = 'FK_WSUser_Detail_WSCountry' 

這應該給你父表和列以及引用的表和列 - 例如,涉及你的外鍵關係的兩方。

這應該有希望清除你錯過了什麼拼圖。

+0

嗨!不幸的是(在某種程度上,如果這樣我會很開心,因爲我知道我的系統中有什麼問題),我的數據庫是正確的,我已經運行了你的腳本,它顯示了我的預期(因爲我已經已經檢查,因爲異常的堆棧跟蹤約束談論約束檢查 有腳本的唯一結果: FK_WSUser_Detail_WSCountry \t WSUser_Detail \t IDCountry \t沒有\t WSCountry \t IDCountry 的結果是正確的,我估計它有隻是一個且唯一的鏈接,它在WSUser_Detail和WSCountry之間。沒有任何內容鏈接到WSUser。 – Micael 2009-12-27 06:25:02

0

您的模型(EDMX)表示WSUser和WSUser_Detail之間存在1:1的關係,但您的問題意味着您期望關係爲1:0..1,所以無論您自己理解還是您的模型是不正確。如果模型具有1:1關係的基數,那麼無論您何時創建或保存WSUser實體,實體框架都會檢查這一點。這是您看到的錯誤的來源。

因爲你的問題意味着這是這種關係的錯誤基數,你可能想去修復EDMX。爲此,請在模型瀏覽器中找到FK_WSUser_Detail_WSCountry關聯。單擊它,然後在「屬性」窗口中展開兩個End屬性。更改適當結束的多重性。

0

我終於找到了問題所在!

我在使用全局上下文,如下所示。 但在之前的一些測試中,我添加了一個不包含任何需要的wscountry引用的用戶詳細信息。 所以它首先遇到了一個異常,這是我所期望的。

真正的問題是,無論何時通過方法AddTo(entityObj)添加無效的實體對象,對SaveChanges()的任何進一步調用都會嘗試將該對象添加到上下文中,即使導致問題的頁面由於Context對象「已損壞」,因此不再存在。

所以每次調用的SaveChanges()將通過一個無效的實體對象的任何AddTo就後一個異常被拒絕......

我的問題是:是否有可能有這樣的有效性的信息實體之前嘗試將其添加到使用的上下文中? 因爲這樣的致命錯誤是合乎邏輯的,但很難理解,因爲它顯示幾個小時前(使用全局上下文處理ASP.Net項目時)發生的錯誤。