我们有多个开发人员在使用Entity Framework 5.0的项目上工作.每个开发人员都使用自己的本地SQL 2012数据库,这样他就可以开发和测试而不会妨碍其他人.
起初,我们使用了自动迁移和基于代码的迁移的混合体.这根本不起作用,所以我们决定禁用自动迁移,只允许基于代码.我应该补充一点,我们再次启动了一个干净的数据库而没有_MigrationsHistory来自所有自动迁移的"损坏" .
所以现在的工作流程是:
add-migration <Name>将其应用于他的数据库update-database.到目前为止,这运作良好.然而,在今天之前,通常只有我做了迁移而其他人应用了它们.但今天有来自三个开发人员的迁移.我刚刚完成了这些迁移,做了一件update-database好事.
我也对自己的数据模型进行了更改,但是在结束时update-database它给了我一个警告,我仍然没有更新,所以我做了add-migration <my migration>.但是,当它支持迁移时,它给了我已经应用到数据库的所有迁移的更改.所以:它试图删除已经删除的列,尝试创建一个已经存在的表,等等.
怎么可能?我的假设是EF只是检查_MigrationsHistory表格并找出表格中没有的迁移,并按名称的时间戳顺序应用这些迁移.但显然不是,因为即使我撤消自己的更改并且我有一个干净的环境,它仍然抱怨我的数据库与模型不同步.但我只是将这些更改删除并应用到我的数据库中.它是同步的.我也可以看到我刚才在_MigrationsHistory表格中应用的迁移.
我唯一能想到的是我在一个不会导致数据库更改的数据模型中添加了一个属性(我List<X>在数据模型中添加了一个Y,其中X是一对多关系中的多个.这不会导致数据库更改,因为X已经有一个外键到Y).可能是吗?如果是这样,那真的很脆弱,因为没有办法为此添加迁移,因为没有数据库更改,我也不知道如何解决这个问题.
我不知道如何处理这个问题,因为我当然可以编辑它所支撑的内容并删除已经应用于我的数据库的所有内容.但那又怎样?我检查它然后其他一些开发人员得到相同的消息,即使他的数据库不适用于我的新更改,支持他自己的更改,获取相同的无意义脚手架,编辑它,检查它然后下一个开发者得到它.它变成了一个恶性循环,与我们使用自动迁移时的情况类似,我认为我们已经通过切换到基于代码的方式来解决这个问题.我现在不能相信做正确的事情,这样做是一场噩梦.
我也尝试过添加我从同事那里逐一删除的迁移,update-database -t:201211091112102_<migrationname>但无济于事.它仍然给我错误的脚手架.
那么我们在这里做错了什么,或者EF根本不是为这样的协作而构建的?
UPDATE
我创建了一个可重现的测试用例,虽然为了模拟这个多用户/多数据库场景,它有点冗长的舞蹈.
https://github.com/JulianR/EfMigrationsTest/
有上述项目时重现的步骤(这些步骤也出现在代码中):
以上是模拟三个用户,其中用户1进入他的数据库,另外两个用户也使用他的初始化来创建他们的数据库.然后,用户2和用户3都对数据模型进行自己的更改,并将其与应用更改所需的迁移一起添加到源控件.然后,用户1拉动用户2和3的更改,而用户1也自己对数据库进行了更改.然后,用户1调用update-database以应用用户2和3的更改.然后,他自己进行迁移,然后错误地将用户2或3的更改添加到脚手架迁移,这会在应用于用户1的数据库时导致错误.
我有一个表'用户'列'电子邮件'.它曾经是唯一的(带索引),但新的要求是允许那里的nils.
有没有比以下更好的解决方案:
remove_index :users, :email
add_index :users, :email
Run Code Online (Sandbox Code Playgroud)
?
最初它添加了唯一的选项:
add_index :users, :email, :unique => true
Run Code Online (Sandbox Code Playgroud) 我需要将整个表从一个MySQL数据库移动到另一个MySQL数据库.我没有完全访问第二个,只有phpMyAdmin访问.我只能上传(压缩)小于2MB的sql文件.但是第一个数据库表的mysqldump的压缩输出大于10MB.
有没有办法将mysqldump的输出拆分成较小的文件?我不能使用split(1),因为我不能将文件cat(1)放回远程服务器上.
还是我错过了另一种解决方案?
编辑
第一张海报建议的mysqldump的--extended-insert = FALSE选项产生一个.sql文件,然后可以将其拆分为可导入文件,前提是使用合适的--lines选项调用split(1).通过反复试验,我发现bzip2将.sql文件压缩了20倍,所以我需要弄清楚有多少行sql代码大致相当于40MB.
我有一个20年的项目,我想从RCS迁移到git,而不会丢失历史.所有网页都表明One True Path是通过CVS进行的.但经过一个小时的谷歌搜索和尝试不同的脚本,我还没有找到任何成功将我的RCS项目树转换为CVS的东西.我希望Stackoverflow上的好人会知道实际上有什么用,而不是声称工作和不工作.
(我使用本机SO搜索和Google搜索搜索了Stackoverflow,但如果数据库中有一个有用的答案,我就错过了.)
更新:http : //git.oblomov.eu/rcs-fast-export上的rcs-fast-export工具于2009年4月14日修复,这个版本似乎对我有用.此工具直接转换为git,没有中间CVS.谢谢Giuseppe和Jakub!
我还记得那些不起作用的事情:
该rcs-to-cvs脚本船在contrib的CVS源代码目录
http://git.oblomov.eu/rcs-fast-export上的rcs-fast-export工具,版本在2010年4月13日之前
该rcs2cvs脚本在名为"CVS-RCS-如何为Linux的文档"的文档中找到
我有以下迁移,我希望能够检查与环境相关的当前数据库是否是一个mysql数据库.如果是mysql,那么我想执行特定于数据库的SQL.
我该怎么做?
class AddUsersFb < ActiveRecord::Migration
def self.up
add_column :users, :fb_user_id, :integer
add_column :users, :email_hash, :string
#if mysql
#execute("alter table users modify fb_user_id bigint")
end
def self.down
remove_column :users, :fb_user_id
remove_column :users, :email_hash
end
end
我在字典中的意思是"变基",而不是git定义......
我有一个大型的,长期运行的Rails项目,大约有250次迁移,所以要管理所有这些项目变得笨拙.
也就是说,我确实需要一个基础来运行测试时清除和重建我的数据库.因此,这些数据非常重要.
是否有任何策略可以说,将模式转储到设定点 - 归档所有旧迁移并重新开始新的迁移.
显然我可以使用rake schema:dump - 但实际上我需要一种方法db:migrate将首先加载模式然后开始运行其余的迁移.
我想继续使用迁移,因为它们在开发中非常有用,但是,我无法回溯并编辑2007年的迁移,因此保留它似乎很愚蠢.
何时可以在迁移的self.down方法中引发ActiveRecord :: IrreversibleMigration异常?您何时应该努力实际实现迁移的逆转?
我知道如何通过http://codeigniter.com/user_guide/libraries/migration.html创建它们
但是,一旦我创建了我的迁移文件,我该如何运行它们?
我需要将我的数据库从sqlite迁移到mysql,而各种工具/脚本对我来说太多了,无法轻松找到最安全,最优雅的解决方案.
这对我来说似乎很不错http://djangosnippets.org/snippets/14/但似乎是3年以来获得更新令人担忧..
你能推荐一个已知Django 1.1.1可靠的解决方案吗?
Microsoft现在在其Team Foundation Service上支持Git存储库.我在Team Foundation Service上有一个帐户,我想将现有的Git存储库推送到那里的项目.
每当我尝试进行搜索时,我会不断发现TFS-GIT或GIT-TF等内容.我很确定我不想要那些,因为我认为这些更改为代码存储库的Team Foundation Server模型,而这不是我想要的.
具体来说,我有一个现有的Git存储库,我想推送到TFService.