实体框架代码优先:两个DbContext和一个数据库初始化程序

时间:2014-11-18 08:26:26

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

我的项目中有两个DbContextApplicationDbContext用于ApplicationUser模型(继承自ASP.NET身份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)
        {
        }
 }

问题:

我在App

中遇到这样的错误
  

类型&#39; System.Data.SqlClient.SqlException&#39;的异常发生在   EntityFramework.dll但未在用户代码中处理

     

其他信息:无法删除数据库&#34; DatabaseName&#34;因为   它目前正在使用中。

我认为它尝试使用一个上下文初始化程序重新创建数据库,但数据库正在由另一个上下文使用。

如何处理此类错误?

1 个答案:

答案 0 :(得分:2)

大多数情况下,对相同的数据库使用多个db-contexts被认为是一种不好的做法。但如果你真的需要这个,我引用了来自here的Ladislav Mrnka的好答案:

  

问题在于,当您想首先使用代码创建数据库时 - 应用程序中只有单个上下文可以执行此操作。这方面的技巧通常是一个附加的上下文,其中包含仅用于创建数据库的所有实体。只包含实体子集的真实应用程序上下文必须将数据库初始化程序设置为null。