1

我想創建多個上下文的EF代碼。 用於StaffContext(HR)的另一個上下文是ShippingContext。代碼第一EF有多個上下文

  1. 是具有多重執行緒的想法有什麼優勢?因爲我覺得構建起來很複雜。

  2. 我們如何構造實體?在基礎上下文中還是在每個單獨的上下文中定義全部?

  3. 在這些情況下,我需要訪問Staff實體,當我嘗試「更新數據庫」時會給我一個錯誤,因爲Staff實體已經存在於其他上下文中。我在不同情況下擁有相同實體的事實是錯誤的設計嗎?

這是我的時刻:

public class StaffContext : BaseContext<StaffContext> 
{ 
    public DbSet<StaffPosition> StaffPositions { get; set; } 

    public DbSet<Staff> Staffs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
} 

public class ShippingContext : BaseContext<ShippingContext> 
{ 
    public DbSet<Armada> Armadas { get; set; } 

    public DbSet<Product> Products { get; set; } 

    public DbSet<Shipment> Shipments { get; set; } 

    public DbSet<ShipmentDetail> ShipmentDetails { get; set; } 

    public DbSet<ShipmentHandler> ShipmentHandlers { get; set; } 

    public DbSet<ShipmentOrder> ShipmentOrders { get; set; } 

    public DbSet<ShipmentOrderDetail> ShipmentOrderDetails { get; set; } 

    public DbSet<Staff> Staffs { get; set; } 

    public DbSet<Pangkalan> Pangkalans { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 
    } 
} 

非常感謝提前。

+0

您可能想要提防這個問題可能導致的對比回答。你很可能會從人們那裏得到答案,或者戴着'EF'帽子或'DDD'帽子。一個將以數據爲中心,另一個將以域爲中心。兩個陣營對「背景」和「實體」這兩個詞的含義有不同的理解。 –

+0

[EF 6加上幾個數據庫上下文]的可能的副本(http://stackoverflow.com/questions/24908719/ef-6-plus-several-db-contexts) – guillaume31

+0

嗨阿德里安湯普森菲利普斯, 是的,說實話我只是開始我的自我,並遇到這個DDD條款,然後我決定挖掘更多關於它。謝謝 – hollycrab

回答

1

我真的不知道爲什麼你會想要這樣做 - 只要有需要的時候重新創建一個上下文在我看來會更好更容易。然而,讓我們開始:

爲1:

  • 多個上下文可以更容易維護,因爲它只是分裂了代碼更在多個對象 - 如果你有問題,一個方面,你可以簡單地看看它的模型並解決問題。不過,你的上下文不應該太複雜。
  • 多個上下文確實具有這樣的優點,即每個上下文的大部分時間不會變得太大,這會帶來性能上的提升。但是,只要嘗試跨越上下文邊界,就會拋棄EF功能,例如爲連接和關係修正創建查詢。
  • 當您訪問具有不同模式或需要不同模型的多個數據庫時,需要使用多個上下文。此外,無論何時您更新數據庫操作(使用SQL,而不是遷移),您都需要多個上下文來訪問更新實體的不同表現形式。

爲2:

  • 你不能在多個上下文同一實體在同一時間。這也意味着您不必爲已經包含在另一個上下文中的實體提供DbSet,除非您可以保證您不會觸及具有不同上下文的相同對象。
  • 當您沒有用於實體集的DbSets時,當然在此上下文中您不需要此實體的模型配置。但是,常規和數據類型映射等常規內容可以在基本上下文中完成。此外,這可能是上下文相關幫助功能的最佳位置。

爲3,雖然已經提到:

  • 可以有多個上下文的地方,但我覺得這應該是一個例外。當您有多個上下文時,
  • 會更頻繁地遇到併發錯誤(因爲您可能會將併發項目更改爲不同上下文中的相同值)
  • 無法跨越這些邊界訪問EF功能(如導航屬性,因爲您不能將這些類型的對象包含在您的上下文中),並且
  • 不能使用更新 - 數據庫/遷移功能,除非您運行風險以在上下文中定義所有實體。

我不覺得這是一般一個不好的設計,但它確實帶來了一些問題,你必須克服,而讓所有物體在同一背景下不具有很多缺點,如果有的話。

+0

嗨DevilSuichiro, 是的,目前我還認爲,多語境會使維護更容易,但單個語境也可能不那麼有害。 我剛開始挖掘這個DDD,因此只是嘗試自己的東西。 非常感謝您的回覆。 – hollycrab