[英]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數據庫,並添加了以下兩個表:
接下來,我從數據庫生成了.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.