【发布时间】:2017-12-25 02:19:32
【问题描述】:
我知道有很多关于这个问题的问题,但是经过几天的思考,我仍然无法弄清楚如何让它发挥作用。
我正在编写一个用于自动校准设备的应用程序。
我有 2 个表 Transmitter 和 Calibration。
一个Transmitter 可以有零个、一个或多个Calibration,一个Calibration 必须属于一个发射器。
现在Transmitter 应该有一个OfficialCalibration,它可以为空,例如在没有完成校准的时候。
所以我想在没有连接表的情况下实现这一点,只需在 Transmitter 中有一个 OfficialCalibrationId。 (两种方式我都需要更新 2 个表,但我的整体表较少)。
将这种关系作为 navigationProperty 也很好,这样我就可以调用 Transmitter.OfficialCalibration 并获得正确的 Calibration。
那么在 EF Code First 中没有“联接”表是否可以做到这一点?
我尝试了使用一对多关系和添加约束来定义一对一的方法,但是这样我有两个问题
- 我需要一个导航属性
Tranmitters在校准中,我不想要它 - 它不起作用,因为当我“注册”一个变送器时,ActualCalibrationId 为 Null,因为此变送器没有校准。
现在我尝试了:
modelBuilder.Entity(of Transmitter)
.HasMany(Function(c)c.Calibrations)
.WithRequired(Function(t)t.Transmitter)
.HasForeignKey(Function(t)t.TransmitterId)
但是下图中显示的一对一关系仍然存在问题。
关系是Transmitter.Id -> Calibration.Id 但应该是Transmitter.OfficialCalibrationId -> Calibration.Id
这样我就不能强制校准是 OfficialCalibration 的唯一一个 Transmitter 对吧?我可以通过某种方式强制吗?我只能考虑使用带有 TransmitterId 和 CalibrationId 列的 Join-Table Transmitter_DefaultCalbration 并将 TransmitterId 设为主键?
我仍在学习将 EF 用于复杂场景,因此任何信息或指导都会很好。
【问题讨论】:
-
在 1:0..1 关联中,1 侧的实体(此处:发送器)是 主体,另一侧是 从属 i> 实体。主体实体生成(或接收)其主键,然后将其复制到从属实体的主键。因此 Id => Id 关系。如果您希望
OfficialCalibrationId成为一个 OfficialCalibration 的 FK,您只能将其建模为第二个 1(校准):N(发射器)关联,并在代码中将其强制为 1:1。 -
@GertArnold 我最终按照你说的做了,并为 ActualCalibrationID 添加了一个过滤的(非空值)唯一索引。我认为这应该可行。
标签: .net vb.net entity-framework foreign-keys relationship