我将根据需要生成Migrations,但不要检查它们进入源代码控制(因为它们往往是开发周期的工件).然后,每个开发人员将根据需要从模型中删除并重新创建自己的数据库.
然后,我们将通过比较代码的分支来生成迁移,并获取sql,以应用于生产或其他共享数据库.
此工作流似乎不起作用,因为无需首先生成所有迁移,然后调用update-database就可以在启用迁移时从头开始生成数据库.由于调用add-migration修改了csproj文件,这使得我的脚本(允许我们轻松地切换分支)不可用.
Migrations is enabled for context ‘ApplicationDbContext’ but the database does not exist or contains no mapped tables. Use Migrations to create the database and its tables,for example by running the ‘Update-Database’ command from the Package Manager Console.
有没有办法恢复为EF5行为,其中Database.Create将创建db的当前版本?
解决方法
This was useful,but not what I used.
我做的是放弃现有的初始化代码,并将其替换为Global.asax中的以下代码.
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext,Configuration>()); using (MyContext temp = new MyContext()) { temp.Database.Initialize(true); }
注意:MyContext是我使用的上下文,配置是启用迁移时创建的配置文件.
我看到很多帖子,人们对此有任何问题,但不是很多描述解决方案.我不知道为什么这么多人,包括我自己,都错过了这个突破性的变化…(如果有一个描述这个地方,我从来没有看到它,直到太晚了.)
编辑:
这是我添加到我的上下文类的代码.我不喜欢它如何工作,但它现在完成工作.请参阅@ Doug对OP的关于对CodePlex投票的评论.
private static readonly Object syncObj = new Object(); public static bool InitializeDatabase() { lock (syncObj) { using (var temp = new TbdContext()) { ObjectContext oc = null; try { oc = temp.ObjectContext; } catch (Exception ex) { //Ignore error Console.WriteLine(ex); } if (oc != null && oc.DatabaseExists()) { return true; } Database.SetInitializer(new MigrateDatabaseToLatestVersion<TbdContext,Configuration>()); try { temp.Database.Initialize(true); return true; } catch (DataException ex) { } } }
然后在我的Global.asax.cs Application_Start()我这样做:
if (databaseInitialized == false) databaseInitialized = MyContext.InitializeDatabase();
编辑:
我升级到EF 6.1,发现这不再工作了(https://stackoverflow.com/a/22770517/2033294)这是我做了什么来解决它:
private static readonly Object syncObj = new Object(); public static bool InitializeDatabase() { lock (syncObj) { using (var temp = new MyContext()) { if (temp.Database.Exists()) return true; var initializer = new MigrateDatabaseToLatestVersion<MyContext,Configuration>(); Database.SetInitializer(initializer); try { temp.Database.Initialize(true); return true; } catch (Exception ex) { //Handle Error in some way return false; } } } }