在单独assembly中启用具有上下文的迁移?

我有一个项目,我想运行我的update-database ,但我有我的模型和上下文在一个单独的项目。

如果我运行enable-migrations我得到这个错误:在程序集“MyProject”中找不到上下文types。

这大概是因为我的上下文是在MyProject.MVC。

如果我对MyProject.MVC运行enable-migrations ,则必须添加一个应用程序configuration文件。 我不想这样做,因为我想在许多项目中使用代码。

所以我可以运行对MyProject的enable-migrations ,并以某种方式告诉它在MyProject.MVC的上下文?

这只能在EF 6中工作,但是有一个版本将-ContextProjectName参数添加到-enable-migrations命令中。 通过使用这个命令你可以做到以下几点:

 enable-migrations -ContextProjectName MyProject.MVC -StartUpProjectName MyProject.MVC -ContextTypeName MyProject.MVC.MyContextFolder.MyContextName -ProjectName MyProject 

这将使用MyProject中的上下文将迁移添加到MyProject项目。 您需要确保具有Migrations的项目具有对您的上下文项目的引用,即MyProject引用MyProject.MVC

您只能在包含Database Context类的项目中运行“Enable-Migrations”。

您的解决scheme将包含2个项目:

 1) MyProject.Models |- Migrations |- 201401061557314_InitialCreate.cs |- Configuration.cs |- MyContext.cs |- App.config (no connection string) 

App.config中

 <?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> </configSections> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework> </configuration> 

 2) MyProject.MVC |- Filters |- InitializeSimpleMembershipAttribute.cs 

InitializeSimpleMembershipAttribute.cs

 namespace MyProject.MVC.Filters { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute { private static SimpleMembershipInitializer _initializer; private static object _initializerLock = new object(); private static bool _isInitialized; public override void OnActionExecuting(ActionExecutingContext filterContext) { // Ensure ASP.NET Simple Membership is initialized only once per app start LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); } private class SimpleMembershipInitializer { public SimpleMembershipInitializer() { try { Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, MyProject.Model.Migrations.Configuration>()); using (var context = new MyContext()) { context.Database.Initialize(force: true); if (!context.Database.Exists()) { // Create the SimpleMembership database without Entity Framework migration schema ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); } } WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); } catch (Exception ex) { throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex); } } } } } 

将MyProject.MVC设置为启动项目

在包pipe理器中,select项目:MyProject.Models

然后运行“Enable-Migrations”在MyProject.Models中创build“Migrations”文件夹

接着是“Update-Database” – > migrations将从启动项目的Web.config中使用连接string来执行迁移

这是一个解决方法:

将一个类添加到MyProject(用于迁移的项目)。 让这个类inheritancedbcontext(MyProject.MVC中的那个)。

然后在MyProject上运行EF迁移命令。

我有同样的问题,我正在使用EntityFramework 4.3.1。 看来,EF6解决了这个问题(根据@SOfanatic的答案),但我不想升级到EF6,因为一些突破的变化(例如在DataAnnotations中)。

所以,我做了什么来解决这个问题(以及我在这个过程中学到的):

  1. 创build一个新的解决scheme(空项目),并添加你想要启用迁移(在你的情况MyProject.MVC)的模型的项目。 您可能需要先安装所需的NuGet软件包,然后才能添加现有项目。

  2. 添加一个连接string的configuration文件(不要担心,这只是欺骗迁移引擎)。 复制你现有的数据库到模型项目输出文件夹(应该是MVC \ bin \ Debug在你的情况下)。 确保configuration文件中的连接string指向该数据库:

     <connectionStrings> <add name="MyDB" providerName="System.Data.SqlServerCe.4.0" connectionString="DataSource=|DataDirectory|\MyDB.sdf"/> </connectionStrings> 
  3. 由于您处于新的解决scheme中,请将您的模型项目设置为启动项目(您可以删除默认项目)。

  4. 在包pipe理器控制台中运行enable-migrations命令。 它应该创build一个包含两个文件的Migrations文件夹:一个Configuration.cs和一个带时间戳的InitialCreate.cs文件。 拥有InitialCreate很好,这就是为什么你把你现有的数据库放在模型项目的输出文件夹中(但是这是可选的)。

  5. 重新加载原来的解决scheme,以便更新这些更改。

我所学到的(据我所知):

  1. 迁移引擎需要的东西看起来像一个有效的连接工作。 我在代码(在另一个项目中)创build我的连接string,并没有工作。 我只是给迁移引擎一个“有效的”连接string,使其工作。
  2. 把你的数据库放到迁移引擎可以find的地方(也就是模型项目的输出文件夹),这样它就创build了迁移的起点。 这个起点基本上是在migrations API中编写的数据库模式。
  3. 一旦迁移设置到位,您可以将所有内容恢复到以前的状态,并且工作正常。
  4. 每次你想手动添加一个迁移时,就像第一次一样,你必须再次“欺骗”迁移引擎。 我还没有尝试过自动迁移,我猜这种方法也适用。

顺便说一下,我使用的是SQL Server CE 4.0数据库,因此与标准的SQL Server数据库或LocalDB相比,有些关于连接string的内容有点麻烦。 除此之外,一切都是一样的。

希望这是有帮助的,并给你一些见解。 如果你对这个迁移的方式有更多的了解,请发表评论。