如何在表条目可以引用同一表中的另一个条目的数据库上建模

时间:2018-09-20 09:40:31

标签: entity-framework database-design asp.net-mvc-5

我有一个Web应用程序,被工程师用于站点上的资产(机器,秤)校准,并且可以基于这些读数生成证书。到目前为止,要求是对于给定的SITE包括多个ASSET,每个资产都有自己的CALIBRATION

我的模态也这样吗?

enter image description here

最近进行了更改,以包括新型证书。 ASSET可以进行多次校准(准确地说是两次),如果需要,可以进行一次校准,如果需要,可以进行一次校准。

我的问题是,适应这种变化的最佳方法是什么?我是否应该将ASSET一对一CALIBRATION之间的关系更改为具有多重性(1..2)的一对多关系,这基本上需要更改很多代码检查。或应在ASSET表中添加另一列,该列指向同一表中的另一个条目。还是有其他选择方式?

我正在使用带有实体框架的ASP.MVC。

映射

public Report_AssetMap()
{
    HasKey(one => one.report_asset_id);

    // Site_Report one-to-many-rel Report_Asset 
    HasRequired(one => one.Site_Report).WithMany(one => one.Report_Assets).HasForeignKey(one => one.site_report_id);

    // Report_Asset one-to-one-rel Asset_Calcert
    HasOptional(one => one.Asset_Calcert).WithRequired(ad => ad.Report_Asset).WillCascadeOnDelete(true);
}

public Asset_CalcertMap()
{
    HasKey(one => one.report_asset_id);

    // User one-to-many Asset_Calcert (with nullable Calcert_handled_by_id at many End)
        HasOptional(o => o.Calcert_Handled_By).WithMany(r => r.Handled_Calcert).HasForeignKey(o => o.calcert_handled_by_id);

}

1 个答案:

答案 0 :(得分:0)

对于每个调整前和调整后证明,我都会有一个单独的表格;这是每个表类继承的可靠用例(EF Core尚未包含该表,但我猜您正在使用EF6)。将公共属性放在基类中,派生用于调整前和调整后证书的类(如果除表名外没有区别,则可以为空),然后MapInheritedProperties并在模型配置中为派生类指定不同的表名。

https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

如果您随后要查询所有Asset_CalCert,则可以在DbSet<Asset_Caclert>中指定一个DbSet DbContext来查询Report_Asset实体可以具有引用每种派生的Asset_CalCert类型的属性。

通过这种方式,您可以保持自己的1 :?关系,同时保持查询所有Asset_CalCert的能力,就像它们在单个表中一样。