2010-10-29 59 views
2

如何通過EF4將實體添加到數據庫而無需首先附加所有引用的實體?EF4 ObjectContext.EntitySet.AddObject()級聯插入

var entity = new MyEntity() { FK_ID = 4 }; // associated entity key 

using (var db = new MyEntities()) 
{ 
    db.MyEntity.AddObject(entity); 

    db.SaveChanges(); 
    db.AcceptAllChanges(); 
} 

此代碼不斷試圖插入一個新的默認值FK_Entity。

我在網上看到一些建議,我需要首先附加FK_Entity,然後將MyEntity.FK屬性設置爲附加的FK_Entity,但這看起來很糟糕。 1)我認爲附加要求加載FK_Entity,我不需要插入實體 - 我已經給它正確的密鑰,並且如果我犯了一個錯誤,SQL將強制引用完整性。 2)因爲我有更多的參考資料,我必須附上每一個?

我無法找到任何選項或重載抑制級聯插入。我一定在想這個錯誤?

謝謝。

回答

1

我發現MVC活頁夾(或東西)的創建,我不想空FK_Entity它來。所以我在Create()控制器處理程序屬性中設置了Exclude = "FK_Entity",並繼續設置fk_id屬性。

我知道我可以使用ViewModels爲此,轉換對象進出EF類型,但我想現在避免這種開銷。

1

什麼,你可以嘗試做的是建立「虛擬」 FK實體僅爲每一個ID屬性集。並確保他們在ObjectStateManager中有EntityStatus.Unchanged,這樣EF不會嘗試「更新」並重寫FK實體的所有其他屬性。

我沒有機會測試,但是沿着線的東西:

var fkEntity = new FK_Entity { ID = 4 }; 
var entity = new MyEntity { FK_Entity = fkEntity }; 

using (var db = new MyEntities()) 
{ 
    db.AddToEntities(entity); 
    ObjectStateEntry fkEntry = db.ObjectStateManager.GetObjectStateEntry(fkEntity); 
    // You can check the state here while debugging, but it's probably `Added` 
    fkEntity.ChangeState(EntityState.Unchanged); 

    db.SaveChanges(); 
} 
+0

感謝您的回答。 +1努力。但是這導致我在ObjectStateManager中已經存在相同密鑰的對象出現更多錯誤。相反,我發現MVC Binder(或其他)正在創建一個我不想要的空FK_Entity。所以我在Create()控制器處理程序中排除FK_Entity屬性,並繼續設置fk_id屬性。 – 2010-10-29 15:39:40