2013-05-15 61 views
0

我想将迁移应用到我的数据库。无法应用迁移

最初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人。

+1

虽然不完全是对整个问题的答案,但随着迁移的逆向工程也引起了一些麻烦。在这里看到我的问题和一个很好的答案可能会有所帮助:http://stackoverflow.com/questions/17736708/unable-to-run-ef5-migration-with-existing-database – Steve

+0

基本上,反向工程DB,添加一个EMPTY迁移和呼叫更新数据库。 – Steve

回答

0

您是否打算重命名您的上下文类而不是数据库中的表?

重新生成上下文,然后在重构/重命名代码之前添加[TableName(“tbl_ContextClassName”)]属性。

我的猜测是,如果数据库不是你的要更改的,那么只有在所有类名称和属性名称的属性名都设置了其数据库名称后才可能重构 - 这是为了避免从“convention over configuration”当你重命名一个类时重命名该表,如果重命名属性,则重命名列。