如何將實體從一個上下文(從DbContext
繼承)複製到另一個上下文中?如何將實體從一個實體框架上下文複製到另一個實體?
我找到的所有東西只能用於ObjectContext
,但不適用於DbContext
或使用DbContext
,但不起作用。
例如,我已發現/嘗試:
- 用途的ObjectContext:CloneHelper在CodeProject
- 設定LazyLoadingEnabled錯誤的結果中未填充的ICollection <>性質(外國鍵)
- 設置ProxyCreationEnabled爲false將ICollection <>屬性保留爲空(外鍵)
- 條目<> .State =分離導致未填充ICollection <>屬性(外鍵)如果在附加屬性之前設置,或者在稍後設置時阻止清除標識。
- AsNoTracking()導致異常(以下情況之一,取決於是否從父的ICollection的<>屬性或第一父插入到遠程上下文第一項):
- 父級:在對象中的' ModelFirstSub_First_Target'角色不能自動添加到上下文,因爲它使用NoTracking合併選項進行檢索。在定義關係之前,明確地將實體附加到ObjectContext。
- 項目:該對象無法添加或附加,因爲其EntityReference具有與該對象的EntityKey不匹配的EntityKey屬性值。
我會用它有兩個目的:
- 複製從一個數據庫到另一個(目標將是原始的克隆;遠程數據庫的本地副本)。應保留對象的ID。
- 將所選實體從一個數據庫添加或更新到另一個數據庫(將本地高速緩存中的更改上傳到遠程原點)。新創建的對象的ID不需要被持久化。
如何執行該操作?
EF 6.1.1,4.5.2 .NET,C#
下面是測試代碼它試圖模擬第二動作(上游化變回到遠程數據庫):
var addedFirst = localContext.Firsts.AsNoTracking().Single(m => m.Id == 4);
var updatedFirst = localContext.Firsts.AsNoTracking().Single(m => m.Id == 2);
addedFirst.Items.First().Id = 0;
addedFirst.Items.First().FirstId = 0;
addedFirst.Id = 0;
remoteContext.FirstItems.Add(addedFirst.Items.First());
remoteContext.Firsts.Add(addedFirst);
var originalFirst = remoteContext.Firsts.Single(m => m.Id == 2);
var originalItem = originalFirst.Items.First();
originalItem.Title = updatedFirst.Items.First().Title;
這裏是模型:
public class ModelFirstBase
{
public virtual int Id { get; set; }
public virtual ICollection<ModelFirstSub> Items { get; set; }
public virtual string Title { get; set; }
}
public class ModelFirstSub
{
public virtual int Id { get; set; }
public virtual int FirstId { get; set; }
public virtual ModelFirstBase First { get; set; }
public virtual string Title { get; set; }
}
PS:屬性需要作爲模型與生產應用程序,它從動態代理益共享被保持虛擬的。
你有沒有嘗試上下文分離和附加方法? – 2014-10-27 21:22:45
DbContext上沒有這樣的方法。 – alik 2014-10-27 21:32:28
Context.Set().Attach(poco)或Context.Set(類型pocoType).Attach(poco)版本。 DbContext支持許多表類型。您正在附加/分離到(n)個集合之一。不是直接上下文 –
2014-10-27 21:39:06