表中的SQL更改ID值,并更新其他表中的所有相关记录

时间:2018-11-25 13:07:38

标签: c# sql-server entity-framework ef-migrations

是否可以更改表中ID列的值并同时更新其他表中的所有相关记录?

示例数据:

Table : Document                        =>  should be:
Id       Code           Title           Id             Title
------------------------------------    ------------------------------------
1        112512         "Some Title"    112512         "Some Title"
2        123234         "Some Title"    123234         "Some Title"  
3        234321         "Some Title"    234321         "Some Title"

Table : Person
Id       Name           DocumentID 
-----------------------------------  
290      "Roberto"      1 ---> should change to 112512      
291      "Roberta"      3 ---> should change to 234321

我正在使用实体框架来访问SQLServer数据库,并且我认为通过上述更改,管理表单和用户输入将更加容易。结构迁移完成。现在我需要一个SQL命令来进行数据迁移。我也尝试过手动迁移数据:

var Pers = unitOfWork.PersonRep.GetAll().ToList();
foreach (var person in persons)
{
    var doc = person.Document;
    int code = int.Parse(doc.Code);
    doc.ID = code;
    person.DocumnetId = code;
}
unitOfWork.Complete();

迁移失败,出现以下错误:

  

属性“ ID”是对象键信息的一部分,不能   进行修改。

2 个答案:

答案 0 :(得分:0)

好像id是主键,作为EF限制的一部分,您不能更改pk,您可以添加另一个id(例如,id_pk)并将id_pk设置为pk,这就是您可以更改id或只是删除插入。

通常,如果您的ID一直在变化,您可能要使用id_pk

答案 1 :(得分:0)

您最好的选择(如果需要保留数据)将是使用ON UPDATE CASCADE选项在DB中重新创建FK(有关更多详细信息,请参见documentation)。然后通过标准SQL UPDATE语句更新值,然后重新创建不带选项的FK。

重新创建(放置和创建)FK可以确保在文档表上运行UPDATE语句时,指向它的所有FK都将自动更新(如果您有更多指向Document.ID的FK,则应使用该选项重新创建它们)。 FK的第二个功能就是按照以前的方式设置事物-我不确定它在代码优先和/或迁移中起什么作用。另外,您还需要确保FK的名称保持相同(同样不确定是否需要)。

这当然假设,您对使用直接SQL感到很自在,因为它完全忽略了迁移部分。