【问题标题】:NHibernate: Persisting subclassed entity to main table (table per class strategy issue)NHibernate:将子类实体持久化到主表(每个类策略问题的表)
【发布时间】:2013-09-17 11:32:25
【问题描述】:

这不是一个问题,只是为了将来......(花了很多时间弄清楚)

public class A
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
}

public class B : A
{
    public string Lastname { get; set; }
}

映射(流畅的 NHibernate):

public class AMap : ClassMap<A>
{
    Table("a");
    Id(x => x.Id).GeneratedBy.Native();
    Map(x => x.Name);
    Map(x => x.Type);

    DiscriminateSubClassesOnColumn<string>("Type")
            .AlwaysSelectWithValue();
}

public class BMap : ClassMap<B>
{
   DiscriminatorValue("BType");
   Extends<A>();
   Map(x => x.Lastname);
}

持久化 BMap 对象导致异常:

例外:

Error dehydrating property value for A.Lastname

内部异常:

Invalid index 1 for this SqlParameterCollection with Count=1

这个不明显的异常表明发生了一些映射错误配置。实际上“选择”查询工作得很好。但是“插入”(ISession.SaveOrUpdate)会导致提到的错误。

修复:

在 AMap 类中,您不需要该行:

Map(x => x.Type);

删除这个持久化器后工作正常

【问题讨论】:

    标签: nhibernate fluent-nhibernate mapping table-per-class


    【解决方案1】:

    type 不需要在类中,也不需要映射为属性,它是数据库中用于区分类型的纯粹实现细节。而不是 Extends SubclassMap 更合适:

    public class AMap : ClassMap<A>
    {
        Table("A");
        Id(x => x.Id).GeneratedBy.Native();
        Map(x => x.Name);
    
        DiscriminateSubClassesOnColumn<string>("Type", "AType")
                .AlwaysSelectWithValue();
    }
    
    public class BMap : SubclassMap<B>
    {
       DiscriminatorValue("BType");
       Map(x => x.Lastname);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 2017-02-07
      相关资源
      最近更新 更多