在多层 MVC 应用程序中启用迁移
Enable Migrations in Multi-Tier MVC Application
我正在使用 MVC 5(Razor Views)、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
如上所示,我通过在包管理器控制台中执行 Enable-Migrations 命令启用了数据层项目迁移。问题是,它只编写与身份相关的模型(AspNetUserRoles、AspNetUserLogins 等)的脚本。迁移如何知道包含实体?我需要它来为我的域项目中的模型编写脚本,但不太确定如何告诉 EF/Migrations 这样做。
更新:
根据请求,我的简单(通过新项目搭建的开箱即用)DbContext class 下面:
public class MyDbContext : IdentityDbContext<ApplicationUser>
{
public MyDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static MyDbContext Create()
{
return new MyDbContext();
}
}
The problem is, it only scripts the models related to Identity
(AspNetUserRoles, AspNetUserLogins, etc.). How does a migration know
to include an entity?
迁移"knows" 在每个上下文的基础上编写脚本的内容。查看Migrations文件夹中的Configuration.cs
class,你会发现它是一个通用的class,传入的DbContext
类型如下:
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
所以它 "knows" 因为您通过传入 MyDbContext
泛型类型参数明确地告诉它。
因此,如果您想添加自己的实体 classes 进行迁移,那么您的 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,那么您可以创建另一个上下文,并将您的实体 DbSet
添加到其中。但是随后您将必须根据 How do I enable EF migrations for multiple contexts to separate databases?
显式启用和更新迁移
我正在使用 MVC 5(Razor Views)、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
如上所示,我通过在包管理器控制台中执行 Enable-Migrations 命令启用了数据层项目迁移。问题是,它只编写与身份相关的模型(AspNetUserRoles、AspNetUserLogins 等)的脚本。迁移如何知道包含实体?我需要它来为我的域项目中的模型编写脚本,但不太确定如何告诉 EF/Migrations 这样做。
更新:
根据请求,我的简单(通过新项目搭建的开箱即用)DbContext class 下面:
public class MyDbContext : IdentityDbContext<ApplicationUser>
{
public MyDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public static MyDbContext Create()
{
return new MyDbContext();
}
}
The problem is, it only scripts the models related to Identity (AspNetUserRoles, AspNetUserLogins, etc.). How does a migration know to include an entity?
迁移"knows" 在每个上下文的基础上编写脚本的内容。查看Migrations文件夹中的Configuration.cs
class,你会发现它是一个通用的class,传入的DbContext
类型如下:
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
所以它 "knows" 因为您通过传入 MyDbContext
泛型类型参数明确地告诉它。
因此,如果您想添加自己的实体 classes 进行迁移,那么您的 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,那么您可以创建另一个上下文,并将您的实体 DbSet
添加到其中。但是随后您将必须根据 How do I enable EF migrations for multiple contexts to separate databases?