我有三个表:
Connection(OwnerGuid, ConnectionTypeId, Connection)
Instrument(Id, Guid, Model, Name, Description)
LaboratoryInfoSystem(Id, Guid, Model, Name, Description)
和rule
是,一个Instrument
仅具有一个连接,而一个LaboratoryInfoSystem
也仅具有一个连接。因此,Instrument
和Connection
之间的关系与LaboratoryInfoSystem
和Connection
是一对一的。
这个想法是Connection
表将保存LaboratortInfoSystem
和Instrument
的连接。为此,我使用LaboratortInfoSystem
字段作为Connection
表中的外键和主键,声明了Guid
和Connection
之间的一对一连接。
还有更好的方法吗?
此外,在Entity Framework
类中使用Instrument
后,我得到了这样的信息:
public virtual Connection Connection { get; set; }
但是在Connection
中,我有:
public virtual ICollection<Instrument> Instruments { get; set; }
这告诉我该关系不是one-to-one
。
我该如何解决?
答案 0 :(得分:1)
首先,请注意事实Each Instrument has one connection
和Each LaboratoryInfoSytem has one Connection
不足以暗示Instrument:Connection 1:1
和LaboratoryInfoSytem: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#代码无法理解它,感到很遗憾。