我正在使用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"));
}
}
哪个有效,但感觉就像是错误的方式或黑客。
答案 0 :(得分:2)
mapping.Id
中的 SingleProductOverrides
存在缺陷。子类没有自己的id,它们从其基类继承Id。如果SingleProduct也是自动化的,那么偶数mapping.JoinedSubClass<SingleProduct>("ProductId");
也是多余的(可能被忽略)(从Override中可以看出它)。 JoinedSubclassConvention
是执行此操作的正确方法。