Inheritance Fluent NHibernate三级子类映射

Inheritance Fluent NHibernate三级子类映射,inheritance,fluent-nhibernate,fluent-nhibernate-mapping,Inheritance,Fluent Nhibernate,Fluent Nhibernate Mapping,我有一个复杂的NHibernate结构来存储我们的3级产品层次结构。当我尝试在第3级(ProductDetail2)保存时,会出现以下错误: 行被另一个事务更新或删除(或未保存的值映射不正确):[Domain.Models.ProductDetail2#193150] 如果我跳过3级保存逻辑,一切都会顺利进行 我们的类继承如下所示。ProductDetail1和ProductDetail2是相同的,只是产品类型不同(出于历史原因) 根据中的定义,我们必须使用两种不同类型的子类映射 Produc

我有一个复杂的NHibernate结构来存储我们的3级产品层次结构。当我尝试在第3级(ProductDetail2)保存时,会出现以下错误:

行被另一个事务更新或删除(或未保存的值映射不正确):[Domain.Models.ProductDetail2#193150]

如果我跳过3级保存逻辑,一切都会顺利进行

我们的类继承如下所示。ProductDetail1和ProductDetail2是相同的,只是产品类型不同(出于历史原因)

根据中的定义,我们必须使用两种不同类型的子类映射

  • Product和ProductDetail1保存到不同的表-每个子类映射表
  • ProductDetail1和ProductDetail2保存到同一个表-每个层次结构映射的表(这是因为唯一区别它们的是ProductTypeId)
我们的Fluent映射如下

public class ProductMap : ClassMap<Product> {   
  public ProductMap() {   
    Table("Product");
    Id(x => x.Id).GeneratedBy.Identity();
    Map(x => x.Name);
    DiscriminateSubClassesOnColumn("ProductTypeId", 0); 
  }
}

public class ProductDetail1Map : SubclassMap<ProductDetail1> {
    public ProductDetail1Map() {
        Table("ProductDetail"); 
        DiscriminatorValue((int)ProductTypeEnum.ProductOne);
        Join(
            "ProductOne", 
            y => {
                y.KeyColumn("Id");
                y.Map(x => x.ShortDescription);
            });
    }
}

public class ProductDetail2Map : SubclassMap<ProductDetail2> {
    public ProductDetail2Map() {
        DiscriminatorValue((int)ProductTypeEnum.ProductTwo);
    }
}
公共类ProductMap:ClassMap{
public ProductMap(){
表(“产品”);
Id(x=>x.Id).GeneratedBy.Identity();
Map(x=>x.Name);
DiscrimiteSubClasseSoncolumn(“ProductTypeId”,0);
}
}
公共类ProductDetail1Map:子类映射{
公共产品详细信息1Map(){
表(“产品详情”);
鉴别器值((int)ProductTypeEnum.ProductOne);
加入(
“产品一号”,
y=>{
y、 键列(“Id”);
y、 Map(x=>x.ShortDescription);
});
}
}
公共类ProductDetail2Map:子类映射{
PublicProductDetail2Map(){
鉴别器值((int)ProductTypeEnum.ProductTwo);
}
}
这可能吗?如果是,我做错了什么

另外,我也发现了类似的情况,但它与我们的情况不同,它在级别1定义(并保存)鉴别器列,而我们在级别0定义它。

感谢上帝的回归测试

测试失败时遇到了上述问题。在对故障进行调查后,我们能够确定(正确地)导致NHibernate错误的不一致数据

上面概述的Fluent映射确实正常工作

public class ProductMap : ClassMap<Product> {   
  public ProductMap() {   
    Table("Product");
    Id(x => x.Id).GeneratedBy.Identity();
    Map(x => x.Name);
    DiscriminateSubClassesOnColumn("ProductTypeId", 0); 
  }
}

public class ProductDetail1Map : SubclassMap<ProductDetail1> {
    public ProductDetail1Map() {
        Table("ProductDetail"); 
        DiscriminatorValue((int)ProductTypeEnum.ProductOne);
        Join(
            "ProductOne", 
            y => {
                y.KeyColumn("Id");
                y.Map(x => x.ShortDescription);
            });
    }
}

public class ProductDetail2Map : SubclassMap<ProductDetail2> {
    public ProductDetail2Map() {
        DiscriminatorValue((int)ProductTypeEnum.ProductTwo);
    }
}