具有单个数据库多个上下文的EF6 Code First Migration

时间:2017-08-07 12:52:22

标签: c# asp.net-mvc entity-framework ef-migrations

我正在构建一个包含3个项目的Asp.net MVC5 + EF6解决方案。 我在我的项目中启用了自动迁移。 下图显示了我的项目结构。

enter image description here

  1. 我有一个主项目和两个子项目。
  2. 我在主项目中有一个BaseContext
  3. 子项目有自己的context类派生自 BaseContext
  4. 以上所有上下文都连接到一个数据库。
  5. 型号:

    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&中运行update-database命令时2一切进展顺利。 但是在项目3中运行update-database命令时会出错:

      

    数据库中已有一个名为“Product”的对象。

    现在我正在使用update-database -script命令生成脚本并手动更改脚本。但是当项目增长时,每次都要改变sql脚本是一项艰巨的任务。

    我通过添加Product来忽略modelBuilder.Ignore<Product>()实体,以便在 Project3 中跳过Product实体的表创建,但它忽略了整个关系。< / p>

    我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

你不能这样做。一个上下文==一个数据库。当您针对特定上下文针对数据库运行迁移时,它将基于该上下文,并将删除任何不适用的表或尝试删除并重新创建数据库。

您应该将所有实体移动到一个类库中,以及包含所有实体的上下文的单个实例。然后,您可以针对类库进行迁移,只需在其他项目中引用。

或者,您可以通过使用现有数据库方法来执行您想要的操作。实质上,您完全关闭基本上下文的迁移,然后每个子上下文只能包含属于它的实体。但是,此时您自己将完全负责管理数据库。

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