gpt4 book ai didi

c# - 具有单数据库多上下文的 EF6 Code First 迁移

转载 作者:行者123 更新时间:2023-11-30 12:21:28 25 4
gpt4 key购买 nike

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

enter image description here

  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) 的属性作为外键引用。

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

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

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

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

我该如何解决这个问题?

最佳答案

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

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

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

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

关于c# - 具有单数据库多上下文的 EF6 Code First 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45547377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com