实体框架代码优先:两个数据库上下文和一个数据库初始值设定项
本文关键字:数据库 一个 两个 代码 框架 实体 上下文 | 更新日期: 2023-09-27 18:30:41
我的项目中有两个DbContext
:ApplicationDbContext
用于ApplicationUser
模型(继承自 ASP.NET Identity IdentityUser
类)和EFDbContext
用于所有其他模型。
他们使用一个数据库。
我为每个上下文创建了两个数据库初始值设定项:
public class ApplicationDbInitializer :
DropCreateDatabaseIfModelChanges<ApplicationDbContext>
{
protected override void Seed(ApplicationDbContext context)
{
// add Admin role and user
... code here
//
base.Seed(context);
}
}
和
public class EFDbInitializer : DropCreateDatabaseAlways<EFDbContext>
{
protected override void Seed(EFDbContext context)
{
}
}
问题:
我在应用程序中收到这样的错误
类型为"System.Data.SqlClient.SqlException"的异常发生在 实体框架.dll但未在用户代码中处理
其他信息:无法删除数据库"数据库名称",因为 它目前正在使用中。
我认为它尝试使用一个上下文初始值设定项重新创建数据库,但数据库正在由另一个上下文使用。
如何处理这样的错误?
大多数情况下,对同一数据库使用多个数据库上下文被认为是一种不好的做法。但如果你真的需要这个,我从这里引用拉迪斯拉夫·姆恩卡的伟大答案:
问题是当您想首先使用代码来创建数据库时 - 应用程序中只有单个上下文可以执行此操作。这样做的诀窍通常是包含一个包含所有实体的附加上下文,该上下文仅用于数据库创建。仅包含实体子集的实际应用程序上下文必须将数据库初始值设定项设置为 null。