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