这是可能的,但由于这种设计在两个实体之间创建了循环依赖关系,因此会给您带来很多问题。例如,不仅仅是一种关系(比如
CrtChk
到
Crt
)不能使用级联删除,但也不能简单地删除
阴极射线管
无需首先更新
ActiveCrtChkId
到
null
(和呼叫
SaveChanges
)。
无论如何,下面是如何配置所需关系的。通常使用它就足够了
InverseProperty
属性来解决导航属性映射的模糊性,但一对一单向(即导航属性仅位于一端)需要流畅的配置(否则将按照约定映射为一对多)。特别是对于关系,我发现显式流畅配置比考虑所有EF常规假设和数据注释(如放置位置)要清楚得多
ForeignKey
属性(在FK属性或导航属性上),放置的字符串是第一个或后面的大小写等。
简而言之,以下是相关关系的完整明确配置:
// Crt 1 - 0..N CrtChk
modelBuilder.Entity<Crt>()
.HasMany(e => e.CartChecks)
.WithOne(e => e.Cart)
.HasForeignKey(e => e.CrtId)
.OnDelete(DeleteBehavior.Cascade);
// CrtChk 1 - 0..1 Crt
modelBuilder.Entity<Crt>()
.HasOne(e => e.ActiveCrtChk)
.WithOne()
.HasForeignKey<Crt>(e => e.ActiveCrtChkId)
.OnDelete(DeleteBehavior.Restrict);
请注意
Cart
属性不能同时用于这两种关系。首先,因为每个导航属性只能映射到一个关系。其次,因为关系模型不能强制执行
CrtChk公司
记录引用人
ActiveCrtChkId
FK具有相同的
CrtId
作为
Id
的
阴极射线管
引用它-它可以是任何其他的(尽管从逻辑上来说,意图是不同的)。