在多层 MVC 应用程序中启用迁移

Posted

技术标签:

【中文标题】在多层 MVC 应用程序中启用迁移【英文标题】:Enable Migrations in Multi-Tier MVC Application 【发布时间】:2015-04-29 16:18:22 【问题描述】:

我正在使用 MVC 5(Razor 视图)、Entity Framework 6(代码优先)、ASP.Net Identity 2.0 和 Web API 创建一个新应用程序。试图创建一个体面的解耦架构,我想在我的数据层中启用迁移,但我对迁移的工作原理有误解。这是我的基本解决方案架构:

MyApplication Solution
|-Domain Project
    |-Entity1
    |-Entity2
    |-Entity3
|-Data Layer Project (References Domain Project)
    |-DbContext (Inherits from IdentityDbContext)
|-Migrations Folder
|-Service Layer Project (Web API)
|-Business Layer Project
|-MVC Project
    |-Views

如上图所示,数据层项目我已经通过在 Package Manager Console 中执行 Enable-Migrations 命令启用了迁移。问题是,它只为与身份相关的模型(AspNetUserRoles、AspNetUserLogins 等)编写脚本。迁移如何知道包含实体?我需要它来为我的域项目中的模型编写脚本,但不太清楚如何告诉 EF/Migrations 这样做。

更新: 根据请求,我的简单(通过新项目搭建的开箱即用)DbContext 类如下:

public class MyDbContext : IdentityDbContext<ApplicationUser>

    public MyDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    
    

    public static MyDbContext Create()
    
        return new MyDbContext();
    

【问题讨论】:

你也可以显示你的 DataContext 类吗? 【参考方案1】:

问题是,它只编写与 Identity 相关的模型 (AspNetUserRoles、AspNetUserLogins 等)。迁移如何知道 包括一个实体?

迁移“知道”要编写什么脚本,因为它基于每个上下文编写脚本。查看 Migrations 文件夹中的 Configuration.cs 类,您会注意到它是一个泛型类,传入的 DbContext 类型如下:

internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>

所以它“知道”,因为您通过传入 MyDbContext 泛型类型参数明确告诉它。

因此,如果您想添加自己的实体类进行迁移,那么您应该为DbContext 中的每个实体创建一个DbSet。即

public class MyDbContext : IdentityDbContext<ApplicationUser> 

    public DbSet<Entity1> Entity1s get;set;

    public MyDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)

    public static MyDbContext Create()
    
        return new MyDbContext();
     

如果您不想为自定义实体重用 MyDbContext,那么您可以创建另一个上下文,并将您的实体 DbSets 添加到其中。但是你必须按照How do I enable EF migrations for multiple contexts to separate databases? 明确启用和更新迁移

【讨论】:

以上是关于在多层 MVC 应用程序中启用迁移的主要内容,如果未能解决你的问题,请参考以下文章

在单独的程序集中启用带有上下文的迁移?

EF 5启用 - 迁移:在程序集中未找到上下文类型

具有捆绑和缩小功能的 ASP.NET MVC 4 应用程序,为啥在调试模式下启用缩小?

启用 EF 代码首次迁移后 Azure 网站出现内部服务器错误

ASP .NET MVC 架构如何适应传统的多层架构

在 ASP.NET MVC 5 应用程序中启用 SSL 会导致 OpenIdConnectProtocolValidator 问题