0

我正在尝试将迁移应用到我的数据库。

最初,使用 EF 电动工具对 DB 进行逆向工程以首先进行编码。在我的数据库中,表名都以 tbl_[NAME] 开头,因此在逆向工程过程完成后,我所有的模型都具有相同的约定。由于模型名称映射到每个模型的 modelMAP 中的表名称,我决定重命名所有生成的模型以在创建迁移时删除“tbl_”并查看“UP”方法,我可以看到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 决定删除所有表并重新创建它们,但这在我的实验中不是问题。但是我想了解为什么更改模型名称会导致完整的数据库重建(新名称映射到与数据库反向工程时相同的表名!)

我的主要问题

在尝试应用迁移时,我最终陷入了循环错误风暴。

第一次尝试给出错误: FK_dbo.tbl_AssetFileLocations_dbo.tbl_AssetFiles_AssetFileID' 不是约束。无法删除约束。请参阅以前的错误。

所以我觉得可以,我将 DropForeignKey 注释掉 //DropForeignKey("dbo.tbl_AssetFileLocations", "AssetFileID", "dbo.tbl_AssetFiles");

然后它在下一个 dropForeignKey 上出现相同的(上下文)错误。所以作为一个实验,我注释掉所有 DropForeignKey 语句。

重新运行 update-database 命令然后会导致错误消息:

无法删除索引“dbo.tbl_AssetFileLocations.IX_AssetFileID”,因为它不存在或您没有权限。

并一一抱怨所有 DropIndex 语句。所以作为一个实验,我注释掉所有并尝试更新数据库

因此,我们可以看到 UP 方法尝试做的下一件事是添加所有表!当然我得到了错误:数据库中已经有一个名为“tbl_AssetFileLocations”的对象。

所以我认为你在这里有点沉闷,你在创建表格后试图删除它们!所以我更改了 Drop table 命令的顺序,使它们位于 Create Table 命令之前,因为这样更有意义。

由于这只是 EF 代码优先和迁移的实验,所以一切都很酷。我很高兴 EF 删除整个数据库架构并重建它。

因此,Drop Table 命令现在位于正确的位置,我重新运行 Update-Database 以获得最终的循环错误:

无法删除对象“dbo.tbl_Assets”,因为它被 FOREIGN KEY 约束引用。

对我自己来说,我认为“是的,这是 FOREIGN KEY 约束,你拒绝在这个练习开始时放弃。

那么我从这里去哪里。从这个实验中可以看出,除了 EF 网站上给出的简单示例之外,Code-First 迁移并不适用于所有人!

有没有人对大型数据库进行逆向工程并成功地进行代码更改并将其迁移到数据库?

我是否应该忘记代码优先并首先返回数据库(我宁愿不 - 我喜欢代码优先的想法)?

请帮助EF的人。

4

1 回答 1

0

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

从头开始再次生成上下文,然后在重构/重命名代码之前添加 [TableName("tbl_ContextClassName")] 属性。

我的猜测是,如果数据库不是您要更改的,那么您可能只需要在所有类名和属性名称都已将其数据库名称设置为属性后进行重构 - 这是为了避免在重命名表时“约定优于配置”如果重命名属性,则重命名类并重命名列..

于 2013-07-25T23:40:28.920 回答