我正在尝试在EF6中为一对零或一个关系建模。
我的模型有一个实体Transmitter
和MeasuringCell
。
变送器必须有一个测量单元,但是一个单元可以属于一个或零个变送器。
在将发送器注册到DB时,发送器必须具有一个单元,但是在注册一个单元时,可能当时尚不知道目标发送器。在这种情况下,一段时间后,将单元格安装在新的发射器中,便可以建立关系。
所以我想要两个实体:
Id
)TransmitterId
-表中的MeasureCell
/ MeasureCellId
-表中的Transmitter
)。但是经过大量搜索和阅读,我仍然无法使它工作。
从MeasureCell到发射器(TransmitterId
)都不需要FK,都可以很好地工作,但是如果我需要知道一个单元格属于哪个发射器,那么拥有它会很好。
另一方面,由于没有TransmitterId
具有FK Transmitter
,因此即使没有FK MeasureCellId
,我仍然能够知道小区属于哪个发射机,但是查询会更加复杂/表现欠佳。
在这里是我的Fluent-APi配置:
modelBuilder.Entity<MeasureCell>().HasOptional(x=>x.Transmitter)
.WithRequired(x=>x.MeasureCell)
.WillCascadeOnDelete(true);
但是您怎么看这种关系是错误的,仅使用PK而不使用FK。 我读了很多书,在我看来,EF 6不支持此功能,但我仍不确定。
也许我用错误的方式对实体建模?
但是这样我会有些头疼,因为我需要手动确保一个单元不被两个发送器引用,并且在保存到DB时我需要“小心”,并且代码会像这样:
var transmitter = context.Transmitters.Add(transmitter);
context.SaveChanges();
transmitter.MeasureCell.transmitter = transmitter;
context.SaveChanges();
这对我来说真的很奇怪...所以我想我不应该那样做...
我已经完全实现了该关系,并通过删除TransmitterId
中的MeasureCell
并配置如下关系来了解EF如何处理它:
modelBuilder.Entity<Transmitter>()
.HasRequired(x => x.MeasureCell)
.WithOptional(x => x.Transmitter)
.WillCascadeOnDelete(true);
但是我仍然有问题,或者做错了什么。通过这种方式,Transmitter
是从属实体,并且级联删除仅在删除MeasureCell
时发生。
在任何其他配置下,我无法将FK放在MeasureCell
-Table中,无法使Transmitter
成为关系中的父级,因为该关系无法按预期运行(即EF已经创建了其他列,或者未将FK设置为正确的列),或者在创建context
时遇到了一些错误(即,EF在MeasureCell
侧为预期的'*'乘法器-一对多关系
由于在我的情况下,发送器必须具有MeasureCell
,但是MeasureCell
不能具有Transmitter
,因此它总是将FK放在Transmitter
-Table中,使其成为依赖。这样,当我删除Transmitter
时,不会删除MeasureCell
。相反,级联删除是在删除MeasureCell
时发生的,相关的Transmitter
也被删除了。
我正在尝试建模的问题
在我公司的“真实世界”中,我们首先构建一个MeasureCell
,该Transmitter
将被注册到数据库,然后等待直到它被构建在Transmitter
中。过了一会儿,发射机就卖了,我们制造了它。此时,MeasureCell
已注册并获得了Transmitter
的分配。
因此,MeasureCell
仅需要注册MeasureCell
,而Transmitter
可以注册而无需 MeasureCell
,因为类似我说过,Transmitter
注册时尚不知道, select count(1) from fact_table
_PARTITIONTIME > (select max (calendar_date ) as date from control_table
where description = 'current year start date')
将被分配给哪个。
但是也许我 EF仍然无法正常工作,或者错误地解决了问题,或者我只是遇到了EF6的局限性 ?? < / p>