2017-08-07 87 views
2

我正在用3個項目構建一個Asp.net MVC5 + EF6解決方案。 我在我的項目中啓用了自動遷移功能。 下圖顯示了我的項目結構。使用單個數據庫多上下文的EF6代碼優先遷移

enter image description here

  1. 我有一個主要項目和兩個分項目。
  2. 我在主項目中有BaseContext
  3. 子項目有自己的context類,其衍生自 BaseContext
  4. 以上所有上下文都連接到一個數據庫。

型號:

模型Project2中

public class Product 
{ 
    [Key] 
    public int ProductId {get;set;} 
    ... 
} 

模型在項目3

public class Order 
{ 
    [Key] 
    public int OrderId {get;set;} 

    [ForeignKey("Product")] 
    public int ProductId {get;set} 

    public virtual Product Product; 

    ... 
} 

項目3實體(Order.ProductId)一種屬性引用從屬性Project2實體(Product.ProductId)作爲外鍵引用。

當我在項目中運行update-database命令1 & 2一切進展順利。眼下

There is already an object named 'Product' in the database.

我使用update-database -script命令生成腳本,並手動更改腳本: 但在項目3運行update-database命令時,它給出了一個錯誤。但是,當項目增長時,每次更改SQL腳本都變得非常困難。

我忽略了Product實體加入modelBuilder.Ignore<Product>()序跳過表創建爲Product實體,在項目3,但它忽略了整個關係。

我該如何解決這個問題?

回答

1

你不能這樣做。一個上下文==一個數據庫。當針對特定上下文針對數據庫運行遷移時,它將基於該上下文,並刪除任何不適用的表或嘗試刪除並重新創建數據庫。

您應該將所有實體移動到一個類庫中,並將它們全部包含在一個上下文中。然後,您可以針對類庫進行遷移,並簡單地引用其他項目。

另外,你可以通過使用現有的數據庫方法來做你想做的事情。本質上,您完全關閉基礎上下文中的遷移,然後每個子上下文只能包含屬於它的實體。但是,在這一點上,您將自己負責管理數據庫。

public class BaseContext : DbContext 
{ 
    public BaseContext() 
     : base("ConnectionString") 
    { 
     Database.SetInitializer<BaseContext>(null); 
    } 
} 
+0

我不喜歡所有的實體移動到一個類庫。在我的項目的子項目是類庫。將他們分成多個項目的主要目標是在項目規模擴大時儘量減少複雜性。如果一個上下文==一個數據庫,那麼與多個項目共享單個上下文的最佳做法是什麼?如何在這種情況下輕鬆實現移民工作? – Rahul

+0

如果需要,您可以將實體分離爲多個類庫,但是它們仍然必須基本上彙集到一個主類庫中,該庫將包含您的上下文並簡單引用所有其他庫。但是,對於任何需要上下文的應用程序中的每個庫,仍然存在固有的依賴關係,因爲上下文庫必須引用所有其他應用程序。換句話說,這隻會出於您自己的解決方案組織目的。您無法簡單地選擇或選擇哪些實體項目是由哪些應用程序引用的。 –

+0

再次,這是代碼首先與遷移的性質。一個上下文必須包含屬於它所代表的數據庫的每個實體。就像我剛纔說的那樣,你可以通過簡單地不允許EF來管理你的數據庫來避開這個問題,而是自己去做。然後,只要你喜歡,你可以擁有儘可能多的上下文,引用任何你喜歡的。 –

相關問題