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

时间:2015-02-27 03:06:13

标签: asp.net-mvc asp.net-web-api entity-framework-6 ef-migrations

我正在使用MVC 5(Razor Views),Entity Framework 6(Code First),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

如上所示,数据层项目我通过在程序包管理器控制台中执行Enable-Migrations命令启用了迁移。问题是,它只编写与Identity相关的模型(AspNetUserRoles,AspNetUserLogins等)。迁移如何知道包含实体?我需要它来编写我的Domain项目中的模型脚本,并且不太确定如何告诉EF / Migrations这样做。

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

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

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

1 个答案:

答案 0 :(得分:1)

  

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

迁移&#34;知道&#34;什么编写脚本,因为它基于每个上下文脚本。查看Migrations文件夹中的Configuration.cs类,您会注意到它是传递DbContext类型的泛型类,如下所示:

internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>

所以它&#34;知道&#34;因为您通过传递MyDbContext泛型类型参数来明确告诉它。

因此,如果您要添加自己的实体类进行迁移,那么DbSet中的每个实体都应该有DbContext。即。

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作为自定义用户,那么您可以创建另一个上下文,并将实体DbSet添加到其中。但是,您必须根据How do I enable EF migrations for multiple contexts to separate databases?

明确启用和更新迁移