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"));
}
}
这是有效的,但感觉是错误的方式或黑客攻击。
SingleProductOverrides
中的mapping.Id
存在缺陷。子类没有自己的id,它们从基类继承了id。如果SingleProduct也是自动映射的(如Override中所示),则即使mapping.JoinedSubClass<SingleProduct>("ProductId");
也是冗余的(可能被忽略)。JoinedSubclassConvention
是正确的方法。