nhibernate mapping.JoinedSubClass(keyColumn)不尊重keyColumn

时间:2012-01-25 02:18:02

标签: c# nhibernate fluent-nhibernate

我正在使用Fluent-NHibernate并尝试使用每个子类方法的表来持久化对象层次结构:

public class AbstractProduct
{
    public int ProductId { get; set; }
    public string Name { get; set; }
}

public class SingleProduct : AbstractProduct
{
    public int SingleProductId { get; set; }
    public string SomeField { get; set; }
}
保存对象时

        var singleProduct = new SingleProduct();
        session.SaveOrUpdate(singleProduct);

我收到此错误:

  

NHibernate.Exceptions.GenericADOException:无法插入:[FluentNHibernateSubClassTest.SingleProduct#3] [SQL:INSERT INTO SingleProductData(Field1,AbstractProduct_id)VALUES(?,?)] ---> System.Data.SqlClient.SqlException:无效的列名称'AbstractProduct_id'。

尽管有以下覆盖:

public class AbstractProductOverrides : IAutoMappingOverride<AbstractProduct>
{
    public void Override(AutoMapping<AbstractProduct> mapping)
    {
        mapping.Id(x => x.ProductId).Column("ProductId");
        //this mapping provided to illustrate the overrides are picked up
        mapping.Table("ProductsData");
        mapping.JoinedSubClass<SingleProduct>("ProductId");//ignored??
    }
}

public class SingleProductOverrides : IAutoMappingOverride<SingleProduct>
{
    public void Override(AutoMapping<SingleProduct> mapping)
    {
        mapping.Id(x => x.SingleProductId);
        mapping.Table("SingleProductData");
        mapping.Map(x => x.SomeField).Column("Field1");
    }
}

我向JoinedSubClass提供的列名无关紧要,但忽略它并使用AbstractProduct_id代替。

如何告诉nhibernate关键列是ProductId而不是AbstractProduct_id

我有一个测试项目,证明可用问题here(您需要创建数据库)

更新 我通过提供以下约定来解决这个问题:

public class JoinedSubclassConvention : IJoinedSubclassConvention
{
    public void Apply(IJoinedSubclassInstance instance)
    {
        if (instance.EntityType == typeof(SingleProduct))
            instance.Key.Column(("ProductId"));
    }
}

哪个有效,但感觉就像是错误的方式或黑客。

1 个答案:

答案 0 :(得分:2)

mapping.Id中的

SingleProductOverrides存在缺陷。子类没有自己的id,它们从其基类继承Id。如果SingleProduct也是自动化的,那么偶数mapping.JoinedSubClass<SingleProduct>("ProductId");也是多余的(可能被忽略)(从Override中可以看出它)。 JoinedSubclassConvention是执行此操作的正确方法。