[英]Entity Framework 4: Table per Type inheritance problem on insert
我有一個簡單的模型,帶有“BaseEntity”和派生的“Fund”實體。 當我嘗試插入新基金時:
HybridModelContainer container = new HybridModelContainer();
//Create new Fund
Fund fund = new Fund();
fund.Id = Guid.NewGuid();
fund.DateCreated = DateTime.Now;
fund.Name = "Fund 1";
fund.Number = 1;
container.BaseEntities.AddObject(fund);
container.SaveChanges();
我收到以下錯誤:
“無法將值NULL插入列'Id',表'HybridData.dbo.BaseEntities';列不允許空值.INSERT失敗。
該語句已終止。”
似乎分配給基金實體的ID未插入BaseEntity表中。 為什么不?
我做了這個“模特第一”。 如果我先設計數據庫,並從中創建模型,一切正常......但我首先需要模型!
另外......為什么我的DataContext
沒有“ Funds
”的ObjectSet
(即container.Funds
)? 在此先感謝您的幫助!
我只能回答你問題的第二部分:“另外......為什么我的DataContext中沒有”基金“的ObjectSet(即container.Funds)?”
ObjectContext在類層次結構中只有一個基類的ObjectSet是正常的。 實際上並不需要派生類的ObjectSet。 要在ObjectContext中添加和刪除派生對象,您可以像在示例中一樣使用ObjectSet<BaseEntity>
/ BaseEntities
的AddObject
和DeleteObject
方法。
對於查詢派生對象,您可以利用ObjectSet的OfType
方法。 它返回派生類型的ObjectQuery,您可以在其中構建進一步的查詢:
ObjectQuery<Fund> query = container.BaseEntities.OfType<Fund>();
(問題的第一部分聽起來像存儲和概念模型之間的映射錯誤。它可能有更好的cif,你可以顯示你的edmx文件的相關部分。)
編輯:問題第一部分的可能解決方案:
我已經在VS2010中使用Model-first創建了您的示例,我可以重現您的問題。 問題似乎與模型中的主鍵不是Int32
而是Guid
的事實有關。 向模型添加新實體時,設計器始終建議將Int32
作為主鍵, StoreGeneratedPattern
設置為Identity
。
如果現在將模型設計器中的鍵的類型從Int32
更改為Guid
但將StoreGeneratedPattern
保持為Identity
,則DDL在SQL Server中創建一個數據庫,其Id
設置為uniqueidentifier
類型,但該列的標識規范為“否”。
因此,當EF向DB發送INSERT命令時,它會從模型定義中“思考”主數據庫將在數據庫中自動生成,並且不會將Guid發送到您在代碼中分配的數據庫。 但是DB不會創建密鑰,導致密鑰為NULL值。 因此我們得到的錯誤。
解決方案:在模型設計器中為BaseEntity
的Id
屬性設置StoreGeneratedPattern
為None
。 對我而言,它起作用了。 當然,在將新對象添加到ObjectSet之前,您有責任始終將Guid分配給Id
,但這似乎是您想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.