【问题标题】:Automatically updating database with multiple DbContexts使用多个 DbContext 自动更新数据库
【发布时间】:2014-09-14 06:03:34
【问题描述】:

我在 ASP.NET 5 项目中使用 EF6。我使用 ASP.NET Identity 作为身份验证机制的地方。正如任何人都会做的那样,我在一个单独的 dll 项目中对我的域对象进行了建模,并且对于数据访问逻辑,我有一个单独的项目。此数据项目包含 EF 迁移、域模型的 DbContext、存储库和工作单元。

我有一个由 ASP.NET 控制器联系的服务层,该服务层将与数据层通信并执行所需的操作。

在主 ASP.NET web 项目中,我有默认的 DbContext,它与 Identity 及其迁移相关。

拥有两个 DbContext 会以某种方式阻止我自动更新数据库。如果在为模型更改创建迁移后我只有一个 DbContext,它将在我第一次尝试访问该网站时自动运行。这不会再发生了,我总是必须手动运行“update-database”命令。

我现在的一个解决方案是在我的数据项目中添加对“Microsoft.AspNet.Identity.EntityFramework”的引用,并使用包含我的域表的身份上下文。但是在我的数据项目中添加 ASP.NET 引用是我不想做的事情,除非我没有其他选择。因为数据层甚至不直接与网络层通信。

尽管 Scott Allen 的 this 视频讨论了这个问题,但并未提出解决方案。

【问题讨论】:

  • 嗨 Geetanga,我和你有相同的项目,在这里我遇到了几乎相同的问题:如果我在包管理控制台中的两个项目之间切换,我可以更新两个数据库。但是如果我将项目发布到天蓝色,只有 dll 项目的迁移被执行,web 项目中的迁移(其中包含 identityContext)没有运行迁移的选项。您能否详细介绍一下您如何使用 DBMigrator 更新数据库?谢谢

标签: asp.net-mvc entity-framework code-first asp.net-identity dbcontext


【解决方案1】:

您可以使用database initializerMigrateDatabaseToLatestVersion 显式启动迁移。此初始化程序允许您明确声明要使用的上下文和配置。比如:

SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 

您还可以在应用启动期间手动调用所有逻辑,有效地执行与Update-Database cmdlet 相同的操作。看看DbMigrator class

【讨论】:

  • 我选择使用 DbMigrator 并通过 Startup 调用来处理这种情况
【解决方案2】:

您可以在每个 DbContext 构造函数中单独运行迁移。

public class DataContext: DbContext 
{
    static DaraContext() 
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, Configuration>());
    }
}


public class ApplicationDbContext : IndetityDbContext 
{
    static ApplicationDbContext() 
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());
    }
}

【讨论】:

  • 我选择使用 DbMigrator 和 Startup 的调用来处理这种情况。我没有使用初始化程序。
猜你喜欢
  • 2019-10-14
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多