EF6-一对零或一对一关系-自己的主键和CascadeDelete

时间:2018-06-20 17:15:51

标签: c# entity-framework orm relational-database

我正在尝试在EF6中为一对零或一个关系建模。

我的模型有一个实体TransmitterMeasuringCell

变送器必须有一个测量单元,但是一个单元可以属于一个或零个变送器。

在将发送器注册到DB时,发送器必须具有一个单元,但是在注册一个单元时,可能当时尚不知道目标发送器。在这种情况下,一段时间后,将单元格安装在新的发射器中,便可以建立关系。

所以我想要两个实体:

  • 拥有自己的PK(Id
  • 彼此具有FK(TransmitterId-表中的MeasureCell / MeasureCellId-表中的Transmitter)。
  • 一个单元不能与2个发射器相关。
  • 删除发射器时,也应删除其单元格。

但是经过大量搜索和阅读,我仍然无法使它工作。

从MeasureCell到发射器(TransmitterId)都不需要FK,都可以很好地工作,但是如果我需要知道一个单元格属于哪个发射器,那么拥有它会很好。

另一方面,由于没有TransmitterId具有FK Transmitter,因此即使没有FK MeasureCellId,我仍然能够知道小区属于哪个发射机,但是查询会更加复杂/表现欠佳。

这是我的模型(一部分)的图片: enter image description here

在这里是我的Fluent-APi配置:

 modelBuilder.Entity<MeasureCell>().HasOptional(x=>x.Transmitter)
           .WithRequired(x=>x.MeasureCell)
           .WillCascadeOnDelete(true);

但是您怎么看这种关系是错误的,仅使用PK而不使用FK。 我读了很多书,在我看来,EF 6不支持此功能,但我仍不确定。

也许我用错误的方式对实体建模?

接近我想要的唯一方法是在它们之间建立一对多关系。 enter image description here

enter image description here

但是这样我会有些头疼,因为我需要手动确保一个单元不被两个发送器引用,并且在保存到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>

0 个答案:

没有答案