我重命名了一些表和一些列。当我运行
Add-Migration
命令时,迁移会生成删除旧表和列并添加具有新名称的代码。这会导致丢失其中包含的数据。
由于我不想丢失数据,所以我想编辑迁移,删除删除和添加命令,并用重命名命令替换它们。
但是编辑迁移后,如何应用该更改?
如果我运行
Update-Database
命令,则会将其应用于数据库。但不是实体框架维护的我的架构的快照(存储在 ApplicationDbContextModelSnapshot
中)。
我需要一种方法将我的编辑合并到模型中。我怎样才能做到这一点?
所以,这绝对是代码中最混乱的部分。
就所提出的问题而言,正如 GuruStron 建议的那样,我发现有效的自定义迁移的唯一方法是对其进行编辑,以使结果与原始生成的迁移产生的结果相同。这可以使其与数据库快照保持同步。运行
Update-Database
将运行您的自定义更新代码。
我认为我最大的问题是我同时进行了太多的改变。在为此苦苦挣扎了一段时间后,我撤消了一些更改,然后一点一点地将它们添加回来。如果实体框架可以确定新名称引用同一列,则实体框架将重命名表或列。如果它发现很多变化,它就无法弄清楚。
最后,我必须对要删除的几个列进行一些自定义迁移(将它们自定义为重命名)。但我能够让实体框架重命名我的表和其他列。
关键:一次进行一些小的更改,并在将其应用到数据库之前仔细检查迁移。如果您需要自定义迁移,请确保最终结果不会改变。
假设您需要删除一个表中的一列并将其添加到另一个表中,但由于原始表中的列包含您不想丢失的数据。您更改实体来完成此操作并进行迁移...但是...新表中的列为空。因此,您可以将 C# 迁移文件编辑为:
在目标表中创建一个新列。
将数据从源列复制到目标列。
删除源表列。
这不是做作,而是真实的需要。
你不知道。
我想您正在使用代码优先方法进行开发,因为问题上有这个标签。
建议阅读: