entity-framework – 如何在启用迁移的情况下生成EF6数据库,而不
在EF5中,我依赖于我可以使用
Database.CreateIfNotExists()从模型中重新创建数据库, 我将根据需要生成Migrations,但不要检查它们进入源代码控制(因为它们往往是开发周期的工件).然后,每个开发人员将根据需要从模型中删除并重新创建自己的数据库. 然后,我们将通过比较代码的分支来生成迁移,并获取SQL,以应用于生产或其他共享数据库. 此工作流似乎不起作用,因为无需首先生成所有迁移,然后调用update-database就可以在启用迁移时从头开始生成数据库.由于调用add-migration修改了csproj文件,这使得我的脚本(允许我们轻松地切换分支)不可用.
有没有办法恢复为EF5行为,其中Database.Create将创建db的当前版本? 解决方法我正在使用CreateDatabaseIfNotExists来初始化数据库,并且能够使用update-database并运行我的应用程序,如果它不存在,它将创建数据库.这似乎已经与EF 6.0.x打破了.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; } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |