簡體   English   中英

EF6 僅使用它的 Id 將實體添加到集合中

[英]EF6 Add entity to a collection only using it's Id

我有一個問題,我需要將實體添加到集合中,並從 EF 中讀取它。 因為集合所屬的實體稍后會被添加到另一個上下文中。

創建示例實體事件並保存到 EFContext 1 並獲取 ID 1。事件需要保存在這里,稍后添加到集合中。

實體 Car 已創建但未添加或保存到上下文中。 Car 在幾個功能之間以及用戶單擊按鈕后傳遞。 汽車被傳遞到另一個 class 並在那里添加到第二個 DBContext (2)。 或者可能用戶取消並且汽車沒有保存並且事件證明它發生了。

Car 有一系列事件作為屬性。 我想將 Event 添加到此集合中,但只能使用它的 id,因為 car 稍后會被另一個 DBContext 2 添加並保存。

通常我想從當前的 DBContext 加載事件並將其添加到汽車實體。 但是隨后兩個 DBContexts 混合在一起。 我想要的是Car.Events.Add(new Event() {EventId == 1}); 但這想要創建一個不是我想要的新事件。

我無法訪問關系表(通過 EF),因為是 EF 生成的。

我想要的甚至可能嗎?

有一些選項可能適合您的方案,但我建議在使用有界上下文時要謹慎,而不接受在引用它們的每個上下文中加載實體的成本。 如果一個 DbContext 創建了一個事件,但另一個 DbContext 創建了一輛您想要綁定到該現有事件的汽車,知道該事件 ID,您可以執行以下操作:

using (var carContext = new CarContext())
{
   var event = new Event { Id = eventId };
   carContext.Events.Attach(event);
   var car = new Car { /* ... */ };
   car.Events.Add(event);

   carContext.SaveChanges();
}

如果第二個上下文的壽命更長,例如范圍為 web 請求等,那么您應該在附加事件之前先使用該引用搜索事件的上下文。

Event event = carContext.Events.Local.SingleOrDefault(x => x.Id == eventId);
if (event == null)
{
   event = new Event { Id = eventId };
   carContext.Events.Attach(event);
}
// ...

如果該事件沒有被持久化,或者在調用此代碼之前已被刪除,這將在 SaveChanges 上引發異常。

一般來說,如果我有一個汽車上下文需要了解事件的有界上下文,但只關心讀取/關聯它們到汽車,並且只需要幾列,我 map 一個簡化的事件實體 model 到僅包含我需要的字段的事件,然后我可以在上下文中廉價地加載這些。 例如,如果 Event 表有 30 列,但就 Cars 而言,我只需要 Event 的 Id、Name 和 DateTime,我的 CarContext 將 map 是一個輕量級的 Event 實體,只有這 3 列而不是完整的 Event 實體定義。 這樣,我的汽車上下文就可以安全且廉價地加載和關聯該事件:

using (var carContext = new CarContext())
{
   var event = carContext.Single(x => x.Id == eventId); // Selects 3 columns from DB or can load from cache for longer-lived contexts. I get an exception here if the Event doesn't exist rather than SaveChanges.
   var car = new Car { /* ... */ };
   car.Events.Add(event);

   carContext.SaveChanges();
}

需要注意的是,這個輕量級事件不能用於創建事件行,除非它擁有所有不可為空的字段,即使這樣,也只有一個 DbContext 應該負責插入任何重要的實體。 我通常在這些實體的名稱前加上“Lw”來表示輕量級,即“LwEvent”。 這些實體有注釋 header 表明它們不用於插入。

暫無
暫無

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

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