合并ASP.Net MVC中的多个数据库上下文

时间:2015-05-20 16:07:59

标签: c# asp.net asp.net-mvc asp.net-mvc-4 ef-migrations

背景:

我有多个名为ApplicationDbContext的类。一个位于根目录中,其余部分分布在模块化区域目录中。目前,我可以选择像这样处理数据迁移。

问题:

如何重写区域文件夹子目录中的每个类以消除单个迁移调用?

来源:

下面的数据库迁移命令

建立根模型的迁移

Enable-Migrations -ContextTypeName:JosephMCasey.Models.ApplicationDbContext -MigrationsDirectory:Migrations\Root
Add-Migration -configuration JosephMCasey.Migrations.Root.Configuration Root
Update-Database -configuration JosephMCasey.Migrations.Root.Configuration -Verbose

为每个“区域”模型建立迁移

Enable-Migrations -ContextTypeName:JosephMCasey.Areas.Article.Models.ApplicationDbContext -MigrationsDirectory:Migrations\Article
Add-Migration -configuration JosephMCasey.Migrations.Article.Configuration Article
Update-Database -configuration JosephMCasey.Migrations.Article.Configuration -Verbose

理想化迁移

Enable-Migrations
Add-Migration Application
Update-Database

C#Classes下面

应用\模型\ IdentityModels.cs

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

应用\领域\条\模型\ Article.cs

namespace JosephMCasey.Areas.Article.Models
{
    public class ArticleContent
    {
    ...
    }
    public class ApplicationDBContext : DbContext
    {
        public DbSet<ArticleContent> Articles { get; set; }
        public DbSet<Category> Categories { get; set; }
        public DbSet<Tag> Tags { get; set; }
    }
}

结束注释

我只是太懒或挑剔?运行单个上下文不是更有效吗?我是新手,所以我对最佳实践的理解充其量是不稳定的。

指导资源

Code First Migration in Multiple DbContext

Inheritance in Entity Framework: Table per Hierarchy

ASP.Net Forums

软件包管理器控制台命令 - get-help Enable-Migrations -detailed&amp; get-help Add-Migration -detailed&amp; get-help Update-Database -detailed

1 个答案:

答案 0 :(得分:2)

必须单独迁移每个唯一的上下文。没有办法解决这个问题。如果您只想进行单个迁移,则必须将所有上下文合并到一个上下文中。就个人而言,无论如何,我建议这样做。除非其中一些用于连接到现有数据库,否则不需要多个上下文来为单个应用程序提供服务。在这种情况下,无论如何都不需要迁移它们。

<强>更新

  

我仍然不确定如何合并所有这些以创建单个上下文。

在基本级别上,您的单个上下文只需要引用所有不同的区域模型名称空间:

using AwesomeApp.Areas.Foo.Models;
using AwesomeApp.Areas.Bar.Models;
using AwesomeApp.Areas.Baz.Models;

public class AwesomeAppContext : DbContext
{
    // DbSets for each areas entities here
}

但是,最好只是重新组织您的项目。实体课程不必进入&#34;模型&#34;目录,他们不必与使用它们的区域一起存储。就个人而言,如果我做一个相对直接的MVC应用程序,我通常会保留主要的&#34;模型&#34;应用程序使用的所有实体的项目根目录中的目录以及引用每个

的单个上下文。

对于更复杂的应用程序,我将其完全移出项目,并将所有实体和上下文放在类库中。然后我针对类库进行迁移,只是将其添加为需要这些实体的项目的引用。

无论你做什么,虽然在不同区域之间散布各种实体会使维护成为一场血腥的噩梦,因为你总是需要记住哪个实体与哪个区域相关,并且上帝禁止在那里&#39 ;甚至在你开始在多个不同区域使用同一个实体的任何流失,但它只在一个中定义。