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

本文关键字:数据库 上下文 合并 ASP Net MVC | 更新日期: 2023-09-27 17:49:57

背景:

我有多个名为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#类

Application''Models''IdentityModels.cs

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }
    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
}

应用程序''领域''文章''模型''文章.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; }
    }
}

尾注

我只是太懒还是太挑剔了?运行单个上下文不是更有效吗?我是这方面的新手,所以我对最佳实践的理解充其量也不可靠。


指导资源

多数据库上下文中的代码优先迁移

实体框架中的继承:每个层次的表

ASP.Net论坛

Package Manager控制台命令-get-help Enable-Migrations -detailed&CCD_ 2&get-help Update-Database -detailed

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

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

更新

我仍然不确定如何将所有这些合并为一个单独的上下文。

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

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
}

然而,最好只是简单地重新组织您的项目。实体类不必进入"Models"目录,也不必与使用它们的区域一起存储。就我个人而言,如果我正在做一个相对直接的MVC应用程序,我通常会在项目根目录中为应用程序使用的所有实体保留主"Models"目录,以及引用每个实体的单个上下文。

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

无论你做什么,尽管实体散布在不同的区域之间会让维护成为一场血腥的噩梦,因为你总是需要记住什么实体与哪个区域相关联,上帝保佑,甚至有任何哔哔哔声,你开始在多个不同的区域使用同一个实体,但它只在一个区域中定义。