实体框架核心与一对一关系:重复条目

时间:2018-09-09 10:10:12

标签: .net entity-framework entity-framework-core ef-core-2.0 ef-core-2.1

存在一对一关系:

builder.Entity<Models.Card>()
    .HasOne<Models.Owner>()
    .WithOne(c => c.Card)
    .HasForeignKey<Models.Owner>("OwnerId");

此刻     OwnerId = 1 has Card.Id = 333 和     OwnerId = 2 has Card.Id = 444

如果尝试将OwnerId = 1的CardId更改为CardId = 444,则会出现类似Duplicate entry ... for key ...的错误,因为OwnerId = 2已经具有相同的Card(Card.Id = 444)。

防止这种行为的最佳方法是什么:从OwnerId = 2中删除Card.Id = 444并将CardId更改为所有者1的请求?

2 个答案:

答案 0 :(得分:1)

是; 1:1是通过一侧上的唯一FK强制执行的,因此必须首先将Owner.CardId的{​​{1}}属性更改为其他值(或删除OwnerId = 2记录)。

除非关系的双方都是可选的(即Owner不必具有Owner,而Card不必具有Card ),则应使用共享的主键(1 :?关系的PK的可选端也应为被请求方的PK的FK)

答案 1 :(得分:0)

首先将CardId的{​​{1}}设置为null(如果可以将其设置为OwnerId),但是如果其他任何行具有{{1},它将再次为您提供重复密钥}值。因此,您必须为此null删除行,然后更新所需的行。