EF迁移应该去哪里,我的类库项目还是我的ASP.NET项目?

我的方案包含:

  • FooBarAsp ,一个asp项目(为应用程序提供UI)
  • FooBar ,类库(应用程序)
  • FooBar.Tests ,一个测试项目(测试应用程序)

FooBar使用EF 6 Code First,包含许多模型和DataContext 。 FooBarAsp使用Microsoft的Identity框架进行用户身份validation,并具有ApplicationDbContext 。 两种情境都很好,并按预期工作。 Global.asax.cs应该执行MigrateDatabaseToLatestVersion (对吧?)。 FooBar.Tests应该执行DropCreateDatabaseAlways并且不关心迁移(对吗?)。

我应该在FooBarAsp或FooBar中启用Flash吗? 对于这两种情况?

在FooBar中运行EnableMigrations后(仅用于踢),我的__MigrationHistory表包含两个InitialCreate行,一个用ContextKey = FooBar.Models.DataContext,另一个用ContextKey = FooBarAsp.Models.ApplicationDbContext。 所以他们都被跟踪了? 如果是这样,(并且因为我没有启用自动迁移),我是否需要在Global.asax.cs中显式运行MigrateDatabaseToLatestVersionMigrateDatabaseToLatestVersion


编辑

为什么我不想将ApplicationUser移动到FooBar并将ApplicationDbContext合并到DataContext

ASP附带的库存ApplicationUser是一个单独的实体(和单独的ApplicationDbContext ,恰好指向同一个数据库)。 ASP的ApplicationUser和Identity框架负责身份validation,注册,电子邮件validation,登录,注销,密码,密码强度,密码重置,双因素身份validation,Cookie,会话,来自facebook / google等来源的外部登录.FooBar不会知道或关心任何这些。 FooBar的User有一个UserName,ASP的ApplicationUser有一个UserName。 当用户登录时,我只是按用户名查找Foobar的User ,并且登录的是谁。因此,当我创建一个新Blog (其中Blog是FooBar实体)时,作者是FooBar的User (不是ApplicationUser )。 最终结果是FooBar不是Web / Desktop / Console / iPhone / Android应用程序。 它是一个库,任何这些东西都可以引用,交互并提供用户界面。 关键是FooBar没有受到任何这些用户界面的污染或偏见。

所以我不想将ApplicationUser移动到FooBar中,因为它来自Microsoft.AspNet.Identity命名空间,而FooBar不知道或不关心ASP.NET(或WPF或者接口恰好是什么)。

就像John在评论中所说的那样,将所有EF代码移动到一个单独的类库中可能会很好。 我通常会为新解决方案创建Web,Domain,DataAccess和Test项目,如果有必要,我们会将其拆分更多。 这为您提供了一些清晰,基本的关注点分离。 Visual Studio Web项目模板不提供,因为它设计为在单个项目中自包含。

Visual Studio的Web模板是小型项目的一个很好的起点,但随着项目的发展,它很快变得一团糟。 在同一个项目中拥有网站(或多或少是您的表示层),域模型和业务逻辑以及数据访问并不是特别好的做法。 通过在Web应用程序中留下用户模型和单独的DbContext来部分地分离它们可能会让IMO更加困惑,特别是如果您的ApplicationUser将参与与您的域类库中的模型的关系。

我建议将ApplicationUser移动到包含域模型的类库中,并将ApplicationDbContext移动到DataAccess类库中。 您可以更进一步,将两个DbContexts合并为一个,除非您怀疑项目将变得足够大,需要多个`DbContexts。 此时,迁移应该存在的位置变得非常明显。 除非你试图将它抽象出来,否则你的初始化程序将总是进入应用程序,在你的情况下是FooBarAsp,所以你是正确的,Global.asax是设置它的地方。

但是 ,如果这对您来说听起来没什么吸引力,并且您希望保持现有的项目结构,那么我认为您最好为DbContext配置迁移,以保持一致性。 此时,您的Web项目(FooBarAsp)中有一组迁移,用于inheritanceIdentityDbContextApplicationDbContext和另一组驻留在类库(FooBar)中的迁移。 两者都需要Web项目的Global.asax.cs中的初始值设定项。

根据OP的更新进行编辑:我可以看到您希望将ASP.NET相关引用保留在域层之外。 如果不像你那样将用户模型分成两部分,基本上不可能避免这种情况发生。 这是我询问VS2013何时仍处于RTM之前并且从未得到满意的答案的问题,因为目前不可能有一个用户模型可以使用不会引入某些ASP.NET相关程序集的Identity。 但是,在某种类似的情况下, DbGeography类型可以是包含在域层中的非常有用的类型,但如果不引入与Entity Framework相关的程序集,则无法使用它。 它真正归结为权衡利弊和挑选两个邪恶中较小的一个 – 在你应用设计模式的时间和地点是务实的。

也就是说,如果你确实希望将DbContext与Web应用ApplicationUser中的ApplicationUser分开,我建议从应用程序用户中取出所有无关的字段 – 实际上,只需使用IdentityUser类本身而不是inheritance它,因为您将纯粹用于身份validation和授权。 但是,我相信您仍然需要为两个上下文启用迁移,并研究如何在EF6 中为每个数据库使用多个上下文 ,这在EF5中是不可能的。