簡體   English   中英

每個類型的表繼承插入問題

[英]Table-per-type inheritance insert problem

我按照這篇文章為我的實體制作了每個類型的表繼承模型,但是當我嘗試將子類的實例添加到數據庫時,我收到以下錯誤。

以下是我創建子類型的方法:

var cust = db.Users.CreateObject<Customer>(); // Customer inherits User
db.Users.AddObject(cust);
db.SaveChanges();

我撥打最后一個電話時收到以下錯誤:

“在不止一個位置生成跨實體或關聯共享的值。檢查映射是否不會將EntityKey拆分為多個存儲生成的列。”

具有以下內部異常:

“已經添加了具有相同鍵的項目。”

關於我可能遺失的任何想法?

更新了REPRO STEPS

創建了一個空白的MS SQL Server 2008 R2數據庫,並添加了以下兩個表:

用戶

  • Id:bigint(PK並將其設置為標識列)
  • 名稱:nvarchar(25)NOT NULL(無論如何,一些隨機屬性

顧客

  • Id:bigint(PK,標識列和Users.Id上的FK)
  • 標題:nvarchar(25)NOT NULL(也是什么,一些隨機屬性)

接下來,我從數據庫生成了.edmx實體模型,並按照頂部的鏈接逐字。 也就是說,我刪除了User和Customer之間的關聯,將User設置為Customer的基類,從Customer實體中刪除了Id屬性,並確保Customer.Id列已映射到繼承的User.Id屬性。 然后我運行了以下小程序:

using (var db = new EF_Test.testEntities())
{
    var cust = db.Users.CreateObject<Customer>();
    db.Users.AddObject(cust);
    db.SaveChanges();
}

我得到了與上述相同的例外情況。 如果這個repro對你有用,請告訴我,如果有,那我做錯了。 我在這個問題上被封鎖了。

我終於找到了麻煩的根源。 對於那些仍然感興趣的人,在Customers表中,Id列應該被設置為表的標識列(雖然PK和FK依賴關系很好)。

在我的情況下,問題是我們的代碼的遺留部分使用了EntityTypeConfiguration中的Map,並且我向Item添加了一個屬性,該屬性導致EF將Item實體拆分為兩個表:dbo.Item和dbo.Item1。 解決方案是在Item1表中的屬性中查找db並將它們添加到顯式映射中。

ObjectContext.CreateObject()都創建T的實例,同時將該實例添加到調用CreateObject()的ObjectContext實例。 因此,您對AddObject()的顯式調用失敗,因為已存在具有相同鍵的Customer對象。 正確的代碼是:

var cust = db.Users.CreateOjbect<Customer>();
// modify any properties on the customer instance
db.SaveChanges();

暫無
暫無

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

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