代码之家  ›  专栏  ›  技术社区  ›  AlphaTry

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

  •  0
  • AlphaTry  · 技术社区  · 7 年前

    我有一个Web应用程序,由工程师使用的资产(机器,秤)校准的网站和证书可以产生基于这些读数。到目前为止,要求是这样的。 SITE 包括多个 ASSET 每个资产都有自己的 CALIBRATION .

    我的模特也是这样。

    enter image description here

    最近更改为包含新类型证书。在哪里 资产 可以有多重校准(两个是精确的)一个调整前和一个如果需要的话。

    我的问题是,适应这种变化的最佳方法是什么?我是否应该改变 资产 一对一 校准 对于一对多的多重性(1..2),这基本上需要更改大量的代码检查。或者应该在 资产 指向同一表中另一项的表。或者还有其他的选择方法吗?

    我用的是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 回复  |  直到 7 年前
        1
  •  0
  •   Moho    7 年前

    对于每个调整前和调整后证书,我都有一个单独的表;这是每个具体类继承的表的一个可靠用例(它还没有包含在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 S,可以指定单个 DbSet<Asset_Caclert> DbSet DbContext 在您的 Report_Asset 实体可以具有引用每个派生的属性。 资产证书 类型。

    这样你可以保留你的1:?关系,同时保持查询所有内容的能力 资产证书 好像他们在一张桌子上。