.net 实体框架核心和一对一关系:重复条目

.net 实体框架核心和一对一关系:重复条目,.net,entity-framework,entity-framework-core,ef-core-2.0,ef-core-2.1,.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"); builder.Entity() .HasOne() .带一张(c=>c.Card) .HasForeignKey(“所有者ID”); 此时此刻 OwnerId=1有卡。Id=3

有一对一的关系:

builder.Entity<Models.Card>()
    .HasOne<Models.Owner>()
    .WithOne(c => c.Card)
    .HasForeignKey<Models.Owner>("OwnerId");
builder.Entity()
.HasOne()
.带一张(c=>c.Card)
.HasForeignKey(“所有者ID”);
此时此刻
OwnerId=1有卡。Id=333
OwnerId=2有卡。Id=444

如果尝试将
OwnerId=1
的CardId更改为
CardId=444
我将得到一个类似
重复条目的错误。。。对于密钥…
,因为OwnerId=2已经有相同的卡(Card.Id=444)


防止此行为的最佳方法是:从OwnerId=2中删除Card.Id=444,并将所有者1的CardId更改为requested?

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

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

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


除非关系的双方都是可选的(即
所有者
不必有
不必有
所有者
),否则应使用共享主键(1:?关系主键的可选方也应是要求方主键的FK)

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

除非关系的双方都是可选的(即
所有者
不必有
不必有
所有者
),否则应使用共享主键(1:?关系的PK的可选方也应是要求方PK的FK)