我正在用3個項目構建一個Asp.net MVC5 + EF6解決方案。 我在我的項目中啓用了自動遷移功能。 下圖顯示了我的項目結構。使用單個數據庫多上下文的EF6代碼優先遷移
- 我有一個主要項目和兩個分項目。
- 我在主項目中有
BaseContext
。 - 子項目有自己的
context
類,其衍生自BaseContext
。 - 以上所有上下文都連接到一個數據庫。
型號:
模型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,但它忽略了整個關係。
我該如何解決這個問題?
我不喜歡所有的實體移動到一個類庫。在我的項目的子項目是類庫。將他們分成多個項目的主要目標是在項目規模擴大時儘量減少複雜性。如果一個上下文==一個數據庫,那麼與多個項目共享單個上下文的最佳做法是什麼?如何在這種情況下輕鬆實現移民工作? – Rahul
如果需要,您可以將實體分離爲多個類庫,但是它們仍然必須基本上彙集到一個主類庫中,該庫將包含您的上下文並簡單引用所有其他庫。但是,對於任何需要上下文的應用程序中的每個庫,仍然存在固有的依賴關係,因爲上下文庫必須引用所有其他應用程序。換句話說,這隻會出於您自己的解決方案組織目的。您無法簡單地選擇或選擇哪些實體項目是由哪些應用程序引用的。 –
再次,這是代碼首先與遷移的性質。一個上下文必須包含屬於它所代表的數據庫的每個實體。就像我剛纔說的那樣,你可以通過簡單地不允許EF來管理你的數據庫來避開這個問題,而是自己去做。然後,只要你喜歡,你可以擁有儘可能多的上下文,引用任何你喜歡的。 –