【问题标题】:Complicated NHibernate component mapping复杂的 NHibernate 组件映射
【发布时间】:2010-11-21 05:51:14
【问题描述】:

编辑:我简化了问题,只留下真正困扰我的地方。

大家好,

我正在尝试进行以下映射。

在我的数据库中,我有一个名为“ReportRowValue”的表,其中包含以下列:

  • 行号
  • 列号
  • 字符串值
  • 长值
  • 日期值
  • 价值

在我的代码中,我想通过从这个表中创建 several 两个类来获得更有用的结构。我想这应该使用组件 和继承 来完成,但我没有设法创建一个工作映射文件。我想要的代码应该是这样的:

报表行

  • 行号
  • 值(下方 ReportValue 的集合)

ReportValue (作为一个抽象类)

  • 列号
  • 价值

ReportValueString / ReportValueLong / ReportValueDate(每一个都继承自ReportValue)

  • 值(每个都有其一种类型的 Value 属性)

仅此而已!

谁能指出我如何为此创建一个 nhibernate 映射文件/文件?

谢谢,

明月

【问题讨论】:

    标签: nhibernate inheritance mapping components


    【解决方案1】:

    有几个工具可以为你映射和构建类,其中之一是

    我这一代 是软件http://sourceforge.net/projects/mygeneration/

    在此页面中,您可以找到运行所需的模板 软件http://www.mygenerationsoftware.com/TemplateLibrary/Archives/?query=nhibernate

    在 mygeneration 工具中使用此工具后,您只需连接到您的数据库,它就会为您生成

    【讨论】:

    • 这对他的问题毫无帮助。如果他应用生成器,它不会创建他想要的类结构。
    • “有人能告诉我如何创建一个 nhibernate 映射文件/文件吗?我是 nhibernate 新手,现在完全迷路了......”这个工具绝对可以帮助他,但他生成代码后需要更改一些映射和类。
    • 让我补充一点:我只是因为这个特定的映射而迷路了。更经典的映射对我来说不是问题(最好是手动纠正它们,所以我学习了!)。无论如何,正如 Sirrocco 所说,您的解决方案将为我生成经典/简单映射,并且不会给我任何关于如何将表格分成几个类的线索。还是谢谢你的工具,以后可能会有用!
    【解决方案2】:

    不幸的是,组件中不能有多态结构。但我不确定你是否需要它。

    以下代码直接来自我的脑海,所以它肯定有错误或遗漏的东西并且不会编译。但它应该显示方向:

    public class ReportRow
    {
      public int Id { get; private set; }
      public IList<IReportValue> Values { get; private set; }
    }
    
    public interface IReportValue
    {
      public int Id{ get; set; }
      public object UntypedValue { get; }
    }
    
    public abstract class ReportValue<T> : IReportValue
    {
      public int Id{ get; set; }
      public T Value { get; set; }
      public object UntypedValue { get { return Value; } }
    }
    
    public class ReportLongValue : ReportValue<long> {}
    public class ReportStringValue : ReportValue<string> {}
    public class ReportDateValue : ReportValue<DateTime>{}
    

    映射:

    <class ReportRow>
      <id ...>
      <bag name="Values" >
        <key column="RowNumber"/>
        <one-to-many class="IReportValue"/>
      </bag>
    </class>
    
    <class name="IReportValue" abstract="true">
      <id ...>
      <subclass name="ReportLongValue">
        <property name="Value" column="LongValue"/>
      </subclass>
      <subclass name="ReportStringValue">
        <property name="Value" column="StringValue"/>
      </subclass>
      <subclass name="ReportDateValue">
        <property name="Value" column="DateValue"/>
      </subclass>
    </class>
    

    【讨论】:

    • 如果我错了,请纠正我,但该解决方案会导致在数据库中创建两个不同的表:ReportRow 和 IReportValue。这正是我想要避免的(对我来说,只有一个行号的 ReportRow 表似乎没有必要)。
    • 没错,有两张表。您可以使用自定义 sql 进行加载和存储来避免它。但这并不是很直接。这个 ReportRow 实际用在哪里?您可能可以将其与持有它的表格合并。
    • 在报表表中使用。我认为合并报表和它的行不是一个好主意。 ;-) 我得出的结论是 nhibernate 不允许这样的结构,所以我放弃了并创建了一个类似于你的两表解决方案。
    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多