是否可以更改表中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”是对象键信息的一部分,不能 进行修改。
答案 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感到很自在,因为它完全忽略了迁移部分。