我想将迁移应用到我的数据库。无法应用迁移
最初DB被逆向工程代码首先使用EF电源的工具。在我的数据库中,表名都以tbl_ [NAME]开头,所以在逆向工程过程完成后,所有模型都有相同的约定。由于模型名称映射到modelMAP中的每个模型的表名,因此我决定在创建迁移并查看“UP”方法时重命名所有生成的模型以删除“tbl_”,我可以看到EF希望在所有受影响的表上全部使用DropForeignKey,然后删除表!什么?
由于我的数据库很大,我会展示的代码只有几行中迁移UP方法。
DropForeignKey("dbo.tbl_AssetFileLocations", "AssetFileID", "dbo.tbl_AssetFiles");
DropForeignKey("dbo.tbl_AssetFileLocations", "StorageLocationID", "dbo.tbl_StorageLocations");
...
DROP ALL FOREIGN KEYS ON ALL TABLES
...
DropIndex("dbo.tbl_AssetFileLocations", new[] { "AssetFileID" });
DropIndex("dbo.tbl_AssetFileLocations", new[] { "StorageLocationID" });
...
DROP ALL INDEXES
...
CreateTable(
"dbo.tbl_AssetFileLocations",
c => new
{
AssetLocationID = c.Guid(nullable: false),
AssetFileID = c.Guid(nullable: false),
StorageLocationID = c.Guid(nullable: false),
DateCreatedonStorage = c.DateTime(nullable: false),
})
.PrimaryKey(t => t.AssetLocationID)
.ForeignKey("dbo.tbl_AssetFiles", t => t.AssetFileID, cascadeDelete: true)
.ForeignKey("dbo.tbl_StorageLocations", t => t.StorageLocationID, cascadeDelete: true)
.Index(t => t.AssetFileID)
.Index(t => t.StorageLocationID);
...
CREATE ALL OTHER TABLES
...
DropTable("dbo.tbl_AssetFileLocations");
...
DROP ALL TABLES
...
我没有数据库中的数据所以虽然我不知道为什么EF已经决定放弃所有表并重新创建他们这是不是在我的实验问题。不过,我想知道为什么改变模型名称造成一个完整的数据库重建尝试时(新名称映射到同一个表名作为DB时,被逆向工程!)
我的主要问题
以圆形错误风暴结束迁移。
1日试图给出错误: FK_dbo.tbl_AssetFileLocations_dbo.tbl_AssetFiles_AssetFileID”不是约束。 无法删除约束。查看以前的错误。
所以我想好了,我会注释掉DropForeignKey //DropForeignKey("dbo.tbl_AssetFileLocations”, “AssetFileID”, “dbo.tbl_AssetFiles”);
然后将其与相同的(上下文)错误下一dropForeignKey错误。因此,作为一个实验,我注释掉了所有的DropForeignKey语句。
重新运行更新的数据库命令,然后导致错误信息:
不能删除索引“dbo.tbl_AssetFileLocations.IX_AssetFileID”,因为它不存在,或者您没有权限。
它一个接一个地抱怨所有的DropIndex语句。所以,作为一个实验我注释掉所有并尝试更新数据库
所以我们可以看到,接下来的事情向上方法试图做的是将所有的表!当然,我得到的错误: 数据库中已经有一个名为'tbl_AssetFileLocations'的对象。
所以我想好EF你在这里是有点沉闷,你想在创建后删除该表!所以我改变Drop table命令的顺序,使它们在Create Table命令之前出现,因为这样做更有意义。
由于这只是与EF代码第一和迁移它是所有很酷的实验。我很高兴EF能够删除整个数据库模式并重建它。
因此与删除表在正确的位置,现在的命令,我重新运行更新数据库内得到最终的圆误差:
无法删除对象“DBO。tbl_Assets',因为它被FOREIGN KEY约束引用。
,对自己,我认为“对,就是外键约束,你拒绝在这个练习开始下降。
那么,我从这里走,从这个实验中它会出现代码 - 首先迁移不会对所有工作,但EF网站上简单的例子给!
有没有人逆向工程的大型数据库,并取得了成功,在修改代码并迁移那些数据库?
我应该忘记代码优先,并首先返回到数据库(我宁愿不 - 我首先喜欢代码的想法)?
请帮助EF人。
虽然不完全是对整个问题的答案,但随着迁移的逆向工程也引起了一些麻烦。在这里看到我的问题和一个很好的答案可能会有所帮助:http://stackoverflow.com/questions/17736708/unable-to-run-ef5-migration-with-existing-database – Steve
基本上,反向工程DB,添加一个EMPTY迁移和呼叫更新数据库。 – Steve