簡體   English   中英

實體框架4:插入時每個類型的表繼承問題

[英]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> / BaseEntitiesAddObjectDeleteObject方法。

對於查詢派生對象,您可以利用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值。 因此我們得到的錯誤。

解決方案:在模型設計器中為BaseEntityId屬性設置StoreGeneratedPatternNone 對我而言,它起作用了。 當然,在將新對象添加到ObjectSet之前,您有責任始終將Guid分配給Id ,但這似乎是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM