2012-06-19 54 views
2

我正在處理一個EF問題,我發現很難調試...以前,每個類型的表繼承設置控制着我係統中的不同用戶類型 - 所有用戶都通用的一種根類型,以及幾種基於使用該帳戶的人的類型的不同子類型。現在,我遇到了一些問題,需要我刪除繼承,並將UserId屬性放在每個子類上,這是用戶ID屬性的外鍵。因此,現在不是用戶,其他用戶類型將具有用戶導航屬性。什麼可能導致實體框架拋出異常與消息「(某種類型)既不是超類型也不是(某種其他類型)的子類型」?

我已經刪除了所有使用EDMX設計器的繼承關聯,我添加了所有UserId屬性及其關聯,確保所有其他用戶類型現在都擁有自己的實體關鍵字,並獲得關聯和導航屬性爲每個特定用戶設置。但是,當我真正運行我的應用程序時,我收到一條TargetInvocationException消息,告訴我「用戶既不是超類型也不是(其他類型)的子類型」。

我一直在尋找這個錯誤消息的其他引用現在有一點,找不到任何東西,我無法確定是什麼導致它。在用戶和我的EDMX中的其他類型之間似乎沒有更多的任何繼承的引用,但仍然是消息依然存在。我以前從來沒有見過這樣的人。

確實沒有任何代碼可供我參考;它似乎是一個映射問題。有沒有人看到過這個特殊消息的例外?

+0

錯誤發生在哪行代碼? –

+0

堆棧跟蹤的前三行: 在System.Data.Common.EntitySql.SemanticAnalyzer。 b__74(BuiltInExpr bltInExpr,SemanticResolver sr)... at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertBuiltIn(Node語義解析器sr)... 顯然,沒有行號可用。它發生在我第一次嘗試檢索任何類型的實體時發生。 – Eska

+0

看起來EDMX中有東西表明你的實體是被繼承的。您是否從數據庫生成EDMX?如果是這樣,請嘗試從更新的數據庫生成新的EDMX,然後比較EDMX文件。 –

回答

0

事實證明,問題實際上並不存在於EDMX中,因爲我懷疑過。通常,當映射出現問題時,代碼總會在同一行發生爆炸,我試圖反思性地實例化實體存儲庫。由於這是拋出異常的地方,我認爲這是一個映射問題,但爲項目關閉自定義錯誤表明,在特定存儲庫的構造函數內部,另一個開發人員插入了對ObjectContext.CreateObjectSet<User>().OfType<(user sub-category type)>()的調用。這是導致問題的原因。我懷疑這個異常在調試的時候並沒有顯示出這一行,因爲這個存儲庫的構造函數被反射調用。更改此通話後,一切正常。

相關問題