nhibernate映射.JoinedSubClass(keyColumn)不尊重keyColumn

本文关键字:keyColumn nhibernate JoinedSubClass 映射 | 更新日期: 2023-09-27 18:21:24

我正在使用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:无法插入:[FluentHibernateSubClassTest.SingleProduct#3][SQL:insert INTO SingleProductData(Field1,AbstractProduct_id)VALUES(?,?)]-->System.Data.SqlClient.SqlException:列名"AbstractProducti_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

我有一个测试项目在这里演示了这个问题(你需要创建数据库)

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

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

这是有效的,但感觉是错误的方式或黑客攻击。

nhibernate映射.JoinedSubClass(keyColumn)不尊重keyColumn

SingleProductOverrides中的mapping.Id存在缺陷。子类没有自己的id,它们从基类继承了id。如果SingleProduct也是自动映射的(如Override中所示),则即使mapping.JoinedSubClass<SingleProduct>("ProductId");也是冗余的(可能被忽略)。JoinedSubclassConvention是正确的方法。