【发布时间】:2015-03-10 21:45:43
【问题描述】:
我的解决方案包含:
- FooBarAsp,一个 asp 项目(为应用程序提供 UI)
- FooBar,一个类库(应用程序)
- FooBar.Tests,一个测试项目(测试应用程序)
FooBar 使用 EF 6 Code First,并包含多个模型和一个DataContext。 FooBarAsp 使用 Microsoft 的 Identity 框架进行用户身份验证,并具有 ApplicationDbContext。两种上下文都很好,并且按预期工作。 Global.asax.cs 应该执行MigrateDatabaseToLatestVersion(对吗?)。 FooBar.Tests 应该执行 DropCreateDatabaseAlways 并且不会关心迁移(对吗?)。
我应该在 FooBarAsp 还是 FooBar 中启用迁移?对于这两种情况?
在 FooBar 中运行 EnableMigrations(只是为了好玩)后,我的 __MigrationHistory 表包含两个 InitialCreate 行,一个具有 ContextKey=FooBar.Models.DataContext,另一个具有 ContextKey=FooBarAsp.Models.ApplicationDbContext。所以他们都已经被追踪了?如果是这样,(并且由于我没有启用自动迁移),我是否需要在 Global.asax.cs 中显式运行 both MigrateDatabaseToLatestVersion<DataContext> 和 MigrateDatabaseToLatestVersion<ApplicationDbContext>?
编辑
我为什么不想将ApplicationUser 移动到FooBar 并将ApplicationDbContext 合并到DataContext 中?
ASP 附带的股票ApplicationUser 是一个单独的实体(和单独的ApplicationDbContext,恰好指向同一个数据库)。 ASP 的ApplicationUser 和身份框架负责身份验证、注册、电子邮件验证、登录、注销、密码、密码强度、密码重置、两因素身份验证、cookie、会话、来自 facebook/google 等来源的外部登录。不知道也不关心这些。 FooBar 的Users 有一个用户名,ASP 的ApplicationUsers 有一个用户名。当用户登录时,我只是通过UserName查找Foobar的User,这就是登录的人。所以当我创建一个新的Blog(其中Blog是一个FooBar实体)时,作者是FooBar的@987654338 @(不是ApplicationUser)。最终结果是 FooBar 不是 Web/Desktop/Console/iPhone/Android 应用程序。它是一个库,任何这些东西都可以引用、与之交互并为其提供用户界面。关键是 FooBar 没有受到任何这些用户界面的污染或偏见。
所以我不想将ApplicationUser 移动到 FooBar,因为它来自 Microsoft.AspNet.Identity 命名空间,而 FooBar 不知道也不关心 ASP.NET(或 WPF 或任何接口) .
【问题讨论】:
-
我不首先使用代码,但是,如何从 Web 项目中删除所有数据访问?把这些都放在一个单独的类库中?
-
迁移特定于您的代码优先模型,而不是您的 ASP.NET 项目,因此它们应该在您的 FooBar 库中。假设您创建了另一个 ASP.NET 或 WPF 项目并引用了 FooBar。您仍然希望/需要可用的迁移。
-
@alexw 好点。我想知道我是否需要迁移 ASP 用户上下文..
标签: c# asp.net entity-framework entity-framework-migrations