我正在构建一个包含3个项目的Asp.net MVC5 + EF6解决方案。 我在我的项目中启用了自动迁移。 下图显示了我的项目结构。
BaseContext
。context
类派生自
BaseContext
。 型号:
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>
我该如何解决这个问题?
答案 0 :(得分:1)
你不能这样做。一个上下文==一个数据库。当您针对特定上下文针对数据库运行迁移时,它将基于该上下文,并将删除任何不适用的表或尝试删除并重新创建数据库。
您应该将所有实体移动到一个类库中,以及包含所有实体的上下文的单个实例。然后,您可以针对类库进行迁移,只需在其他项目中引用。
或者,您可以通过使用现有数据库方法来执行您想要的操作。实质上,您完全关闭基本上下文的迁移,然后每个子上下文只能包含属于它的实体。但是,此时您自己将完全负责管理数据库。
public class BaseContext : DbContext
{
public BaseContext()
: base("ConnectionString")
{
Database.SetInitializer<BaseContext>(null);
}
}