使用带有 NHibernate.Mapping.Attributes 的鉴别器为每个子类做表

Posted

技术标签:

【中文标题】使用带有 NHibernate.Mapping.Attributes 的鉴别器为每个子类做表【英文标题】:Doing table per subclass using a discriminator with NHibernate.Mapping.Attributes 【发布时间】:2010-06-29 11:21:20 【问题描述】:

我正在尝试使用 NHibernate.Mapping.Attributes 执行 Table per subclass: using a discriminator。 hbm 应该如下所示:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <subclass name="SalesReport" discriminator-value="SalesReport" extends="Report">
    <join table="SalesReport">
      <key foreign-key="FK_SalesReport_Document" />
      <property name="TotalSales" />
      <property name="NetGrouth" />
    </join>
  </subclass>
</hibernate-mapping>

代码如下所示:

[Subclass(NameType=typeof(SalesReport),
    DiscriminatorValueObject=DocumentDiscriminator.SalesReport,
    ExtendsType=typeof(Report))]
[Serializable]
public partial class SalesReport : Common.Documents.Report

    [Join(Table = "SalesReport")]
    [Key(1, ForeignKey = "FK_SalesReport_Document")]
    [Property(2)]
    public virtual decimal TotalSales
    
        get;
        set;
    

    [Join(Table = "SalesReport")]
    [Key(1, ForeignKey = "FK_SalesReport_Document")]
    [Property(2)]
    public virtual decimal NetGrouth
    
        get;
        set;
    

结果是这样的:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <subclass name="SalesReport" discriminator-value="SalesReport" extends="Report">
    <join table="SalesReport">
      <key foreign-key="FK_SalesReport_Document" />
      <property name="TotalSales" />
    </join>
    <join table="SalesReport">
      <key foreign-key="FK_SalesReport_Document" />
      <property name="TotalSales" />
      <property name="NetGrouth" />
    </join>
  </subclass>
</hibernate-mapping>

它创建了正确的表结构(一个表有两个十进制字段和一个 PF/FK 到报告表),但是在插入数据时它失败了,因为它为每个字段生成了两个插入:

NHibernate: INSERT INTO SalesReport (TotalSales, SalesReport) VALUES (@p0, @p1);@p0 = 13400,20, @p1 = 41
NHibernate: INSERT INTO SalesReport (NetGrouth, SalesReport) VALUES (@p0, @p1);@p0 = 0, @p1 = 41

有没有办法使用 NHibernate.Mapping.Attributes 来完成这项工作?

【问题讨论】:

【参考方案1】:

您应该遵循 XML 版本来使用 NHMA: 所以,如果你想要一个,只添加一个 NHMA.Join,两个 [Property(2 & 3, Name="...")]

【讨论】:

以上是关于使用带有 NHibernate.Mapping.Attributes 的鉴别器为每个子类做表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有或不带有 Appium 的 Robot Framework 集成 WinAppDriver?

使用带有 ajax Rest 调用的 Spring CSRF 和带有 Thymeleaf 的 HTML 页面

如何在带有 React 的 Typescript/JSX 中使用带有箭头函数的泛型?

优化数据库有啥更好的方法:使用带有不同过滤器的一堆存储过程,还是使用带有 if 条件的单个存储过程?

使用带有数据数组的 Yii2 和带有排序和过滤的 Gridview

使用 ORM,我可以将带有 a、b、c 列的 DB 表映射到带有带有键 a、b、c 的 Map 的类吗?