使用单数据库多上下文进行 EF6 Code First 迁移

Rah*_*hul 5 c# asp.net-mvc entity-framework entity-framework-migrations

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

在此处输入图片说明

  1. 我有一个主项目和两个子项目。
  2. 我有一个BaseContext主要项目。
  3. 子项目有自己的context类,这些类派生自 BaseContext.
  4. 以上所有上下文都连接到一个数据库。

楷模:

Project2 中的模型

public class Product
{
    [Key]
    public int ProductId {get;set;}
    ...
}
Run Code Online (Sandbox Code Playgroud)

Project3 中的模型

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

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

    public virtual Product Product;

    ...
}
Run Code Online (Sandbox Code Playgroud)

来自Project3实体 ( Order.ProductId) 的属性引用来自Project2实体 的属性(Product.ProductId)作为外键引用。

当我update-database在项目 1 和 2 中运行命令时,一切顺利。但是当update-database在项目 3 中运行命令时,它给出了一个错误:

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

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

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

我该如何解决这个问题?

Chr*_*att 3

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

您应该将所有实体以及包含所有实体的上下文的单个实例移至类库中。然后,您可以迁移类库并在其他项目中简单地引用。

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

public class BaseContext : DbContext
{
    public BaseContext()
        : base("ConnectionString")
    {
        Database.SetInitializer<BaseContext>(null);
    }
}
Run Code Online (Sandbox Code Playgroud)