簡體   English   中英

具有單個數據庫多個上下文的EF6 Code First Migration

[英]EF6 Code First Migration with single database multiple context

我正在構建一個包含3個項目的Asp.net MVC5 + EF6解決方案。 我在我的項目中啟用了自動遷移。 下圖顯示了我的項目結構。

在此輸入圖像描述

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

楷模:

Project2中的模型

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

Project3中的模型

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

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

    public virtual Product Product;

    ...
}

Project3實體( Order.ProductId )中的屬性引用Project2實體(Product.ProductId)的屬性作為外鍵引用。

當我在項目1和2中運行update-database命令時,一切進展順利。 但是當在項目3中運行update-database命令時會出錯:

數據庫中已經有一個名為“Product”的對象。

現在我正在使用update-database -script命令生成腳本並手動更改腳本。 但是當項目增長時,每次都要改變sql腳本是一項艱巨的任務。

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

我該如何解決這個問題?

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

您應該將所有實體移動到類庫中,以及包含所有實體的上下文的單個實例。 然后,您可以針對類庫進行遷移,只需在其他項目中引用即可。

或者,您可以通過使用現有數據庫方法來執行您想要的操作。 實質上,您完全關閉基本上下文的遷移,然后每個子上下文只能包含屬於它的實體。 但是,此時您將完全負責管理數據庫。

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

暫無
暫無

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

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