在EFCore中添加一对一关系时迁移数据?在我的一个表中添加新的一对一关系后,我不知道如何将默认数据添加到数据库中的现有行。我的数据库在升级之前基本上是这样的:--Team--Name:TEXT--History--Id:INT...其中history是从其他不相关的表指向它的外键。在我的升级中,我基本上希望团队有历史记录,所以我的新数据库看起来像:--Team--Name:TEXTHistoryId:INT--History--Id:INT我现在的问题是,我有现有的团队我的数据库,他们需要指向唯一的历史记录行,所以我需要为每个现有团队创建一个新的历史记录行。我尝试在迁移中手动添加Up方法中的条目,但它失败了,因为我的模型与现有模式不匹配。protectedoverridevoidUp(MigrationBuildermigrationBuilder){migrationBuilder.AddColumn(name:"HistoryId",table:"Team",nullable:false,defaultValue:0);使用(vardb=newXMDBContext()){foreach(varteamindb.Team)team.History=newXMHistory();db.SaveChanges();}migrationBuilder.CreateIndex(name:"IX_Team_HistoryId",table:"Team",column:"HistoryId",unique:true);migrationBuilder.AddForeignKey(name:"FK_Team_History_HistoryId",table:"Team",column:"HistoryId",principalTable:"History",principalColumn:"Id",onDelete:ReferentialAction.Cascade);不幸的是,目前EFCore不支持从Seed数据迁移。该问题在其存储库中被跟踪为#629-SeedData。我目前看到的唯一解决方案是通过MigrationBuilder.Sql方法使用良好的旧SQL。不幸的是,无法访问数据库提供程序服务,因此下一步是针对SQLServer(尽管我尝试仅使用标准SQL命令)。让原始模型如下:publicclassTeam{publicintId{get;放;}公共字符串名称{得到;放;}}publicclassHistory{publicintId{get;放;}}从Team添加FK到History它变成:publicclassTeam{publicintId{get;放;}公共字符串名称{得到;放;}publicintHistoryId{得到;放;}公共历史历史{得到;放;}}自动生成的迁移是:protectedoverridevoidUp(MigrationBuildermigrationBuilder){migrationBuilder.AddColumn(name:"HistoryId",table:"Team",nullable:false,defaultValue:0);migrationBuilder.CreateIndex(name:"IX_Team_HistoryId",table:"Team",column:"HistoryId");migrationBuilder.AddForeignKey(name:"FK_Team_History_HistoryId",table:"Team",column:"HistoryId",principalTable:"History",principalColumn:"Id",onDelete:ReferentialAction.Cascade);现在,在CreateIndex命令之前,我们手动插入以下内容:migrationBuilder.AddColumn(name:"TeamId",table:"History",nullable:true);migrationBuilder.Sql(@"insertintoHistory(TeamId)选择IdfromTeam");migrationBuilder.Sql(@"updateTeamsetHistoryId=(selectIdfromHistorywhereTeamId=Team.Id)");migrationBuilder.DropColumn(name:"TeamId",table:"History");这个思路很简单,我们在History表中创建一个临时的可为空的列TeamId,为Team表中的每条记录插入一条对应TeamId的新记录,然后以History表中的TeamId列为key进行更新Team表中的TeamIdHistoryId列,最后删除临时列。至此,数据转换完成,可以创建FK约束。远非好的做法,但可以作为解决方法。编辑:之后GertArnold的评论,看起来使用SQL块是正确的方法。我唯一关心的是如何编写与数据库无关的和/或特定的SQL。当然,如果您针对单个特定的数据库类型,则问题不存在。无论如何,如果你需要处理不同的数据库类型,你总是可以使用所有目标数据库支持的标准SQL命令,以及基于MigrationBuilder.ActiveProvider属性的具体if块。以上是C#学习教程:Migratingdatawhenaddingaone-EFCore中的一对一关系?分享的所有内容,如果对大家有用,需要详细了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
