如何使用一个公用表创建一对一关系?

时间:2018-07-09 08:24:41

标签: c# sql sql-server entity-framework database-design

我有三个表:

Connection(OwnerGuid, ConnectionTypeId, Connection)
Instrument(Id, Guid, Model, Name, Description)
LaboratoryInfoSystem(Id, Guid, Model, Name, Description)

rule是,一个Instrument仅具有一个连接,而一个LaboratoryInfoSystem也仅具有一个连接。因此,InstrumentConnection之间的关系与LaboratoryInfoSystemConnection是一对一的。

这个想法是Connection表将保存LaboratortInfoSystemInstrument的连接。为此,我使用LaboratortInfoSystem字段作为Connection表中的外键和主键,声明了GuidConnection之间的一对一连接。

  

还有更好的方法吗?

此外,在Entity Framework类中使用Instrument后,我得到了这样的信息:

public virtual Connection Connection { get; set; }

但是在Connection中,我有:

public virtual ICollection<Instrument> Instruments { get; set; }

这告诉我该关系不是one-to-one

  

我该如何解决?

1 个答案:

答案 0 :(得分:1)

首先,请注意事实Each Instrument has one connectionEach LaboratoryInfoSytem has one Connection不足以暗示Instrument:Connection 1:1LaboratoryInfoSytem:Connection 1:1。缺少的是:您确定每个连接最多只能属于一个Instrument或LaboratoryInfoSytem吗?

不管以上几点,由于Instrument和LaboratoryInfoSystem都共享Connection,所以仅将Connection列放入两者并不明智。您可以创建一个新表,其中包含Connection和(Instrument或LaboratoryInfoSytem)之间的关联。我要提到的OR不是代码,而是设计考虑因素,称为polymorphic association,这是一种常见的设计难题。我建议使用this article的各种解决方案,以查看最适合您的解决方案。

编辑添加:由于从注释中提供的1:1关系是正确的,这意味着您的c#代码可能无法处理多态关联的逻辑。如果要创建Instrument / LaboratoryInfoSystem的统一表,它可能会工作/声明。当然,如果完成此操作,则您不需要Connection_per_element甚至是Connection表:您只需将它们全部放在一个表中即可。但是,Instrument和LaboratoryInfoSystem听起来并不太相似,所以我想您必须走多态关联的路线,只是……对于您的c#代码无法理解它,感到很遗憾。