【问题标题】:Fluent NHibernate Inheritance IssueFluent NHibernate 继承问题
【发布时间】:2010-08-12 13:29:26
【问题描述】:

我在 Fluent 中使用 Nhibernate,但遇到了继承问题。

这是我的数据库架构

表基

  • IDBASE (PK)
  • 字段1
  • 类型

表 T1

  • IDBASE(PK 和 FK)
  • 字段2
  • 字段3 ...

我的映射文件是:

public class BaseMap: ClassMap<BASE>
{
    public BaseMap()
    {
        Id(x => x.Id, "IDBASE").GeneratedBy.Identity();

        Map(x => x.Field1);
        DiscriminateSubClassesOnColumn("TYPE");
    }
 }

    public class T1Map: SubclassMap<T1>
    {

        public T1Map()
        {
            Table("T1");
            KeyColumn("IDBASE");
            DiscriminatorValue("T1");

            Map(x => x.Field2).Not.Nullable();
            Map(x => x.Field3).Not.Nullable();
        }
    }

我使用 FluentMappings 而不是 AutoMapping。

这里是我的实体:

public abstract class BASE
{
   public virtual long IdBase{ get; set; }
   public virtual string Field1 { get; set; }
}

public class T1: BASE
{
    public virtual string Field2 { get; set; }
    public virtual string Field3 { get; set; }
}

T1 实体继承自 BASE 实体,问题是当我尝试获取一行时 NHibernate 尝试在 Base Table 上选择 Field2 和 Field3 而它们应该在 T1 Table 上选择。

我已经尝试了几十个黑客,但它仍然不起作用,如果有人作为一个想法会非常有帮助。

非常感谢。

【问题讨论】:

    标签: fluent-nhibernate


    【解决方案1】:

    您正在指定一个鉴别器,这意味着继承结构应该是一个表每类层次结构;使用此设置您将不会有两个表,您将有一个包含所有内容的表(因此选择为所有列命中同一个表的原因)。

    如果您删除 DiscriminateSubclassesOnColumn 调用,这会将您的映射放入每个类的表中,因此您将拥有所需的结构。

    【讨论】:

      【解决方案2】:

      实际上我真的需要DiscriminateSubclassesOnColumn,所以我找到了另一个解决方案,在我继承的实体中,我使用这样的连接进行映射:

      public class T1Map: SubclassMap<T1>
      {
      
          public T1Map()
          {
              Join("T1", y =>
              {
                  y.KeyColumn("IDBASE");
                  y.Map(x => x.Field2).Not.Nullable();
                  y.Map(x => x.Field3).Not.Nullable();
              }); 
          }
      }
      

      而且效果很好,我可以将鉴别器列保留在我的基类中。

      谢谢

      【讨论】:

        猜你喜欢
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        相关资源
        最近更新 更多