遇到问题设置NHibernate Envers和表/类映射

遇到问题设置NHibernate Envers和表/类映射,nhibernate,nhibernate-envers,Nhibernate,Nhibernate Envers,我们一直在考虑使用Envers,但遇到了障碍。我们使用一个表/类结构,对几个类使用表/类继承。在加载NHibernate和Envers时,当它尝试为子类创建表时会发生错误 NHibernate.MappingException:无法为生成insert语句 类Demo.Vehicle\u AUD:添加 鉴别器-->System.ArgumentException:列 “VehicleTypeId”已添加到此SQL生成器中 参数名称:columnName 下面是一个与我们正在使用的类似的示例 //

我们一直在考虑使用Envers,但遇到了障碍。我们使用一个表/类结构,对几个类使用表/类继承。在加载NHibernate和Envers时,当它尝试为子类创建表时会发生错误

NHibernate.MappingException:无法为生成insert语句 类Demo.Vehicle\u AUD:添加 鉴别器-->System.ArgumentException:列 “VehicleTypeId”已添加到此SQL生成器中

参数名称:columnName

下面是一个与我们正在使用的类似的示例

// Maps to Vehicle table
public Vehicle
{
  public int VehicleId {get;set;}
  pubic VehicleType VehicleTypeId {get;set;}
}

// Maps to Vehicle table with discriminator for VehicleTypeId == Car
public Car : Vehicle
{
   public decimal MaxSpeed {get;set;}

}

// Maps to Vehicle table with discriminator for VehicleType == Airplane
public Airplane : Vehicle
{
   public decimal MaxAirspeed {get;set;}
   public decimal MaxAltitude {get;set;}
}
表定义:

VehicleId int identity primary key
VehicleTypeId int foreign key to VehicleTypeId on VehicleType table
MaxSpeed decimal null
MaxAirspeed decimal null
MaxAltitude decimal null
我们正在使用FluentNHibernate:

var fluentConfig = FetchDbConfiguration(connectionString)
    .Mappings(mapper =>
        {
            mapper.FluentMappings.AddFromAssemblyOf<Vehicle>()
        })
    .ExposeConfiguration(cfg =>
        {
            var enversConf = new FluentConfiguration();
            //enversConf.Audit<Vehicle>();
            enversConf.Audit<Car>();
            enversConf.Audit<Airplane>();
            nhConf.IntegrateWithEnvers(enversConf);        
        });

var nhConfiguration = fluentConfig.BuildConfiguration();
return nhConfiguration;
var fluentConfig=FetchDbConfiguration(connectionString)
.Mappings(映射器=>
{
mapper.FluentMappings.AddFromAssemblyOf()的
})
.ExposeConfiguration(cfg=>
{
var enversConf=new FluentConfiguration();
//enversConf.Audit();
enversConf.Audit();
enversConf.Audit();
nhConf.IntegrateWithEnvers(enversConf);
});
var nhConfiguration=fluentConfig.BuildConfiguration();
返回配置;
映射:

    public partial class VehicleMap : ClassMap<Vehicle>
    {
        public VehicleMap()
        {
        Table("Vehicle");
        LazyLoad();
        Id(x => x.VehicleId)
                    .Column("VehicleId")
                    .CustomType("Int32")
                    .Access.Property()
                    .Not.Nullable()
                    .Precision(10)                
                    .GeneratedBy.Identity();
        DiscriminateSubClassesOnColumn("VehicleTypeId", 0)
            .CustomType<int>()
            .ReadOnly()
            .SqlType("int")
            .Not.Nullable();
        }   
    }
public partial class CarMap : SubclassMap<Car>
{
   public CarMap()
   {
       DiscriminatorValue(1); // 1 = Car
       Map(x => x.MaxSpeed)    
        .Column("MaxSpeed")
        .CustomType("Decimal")
        .Access.Property()
        .Generated.Never()
        .Default(@"0")
        .Precision(19)
        .Scale(4);
       }
    }
公共部分类车辆地图:类地图
{
公共车辆地图()
{
表(“车辆”);
懒散的负荷();
Id(x=>x.VehicleId)
.栏(“车辆ID”)
.CustomType(“Int32”)
.Access.Property()
.Not.Nullable()
.精度(10)
.GeneratedBy.Identity();
DiscriminateSubClassesOnColumn(“车辆类型ID”,0)
.CustomType()
.ReadOnly()
.SqlType(“int”)
.Not.Nullable();
}   
}
公共部分类CarMap:子类映射
{
公共CarMap()
{
鉴别器值(1);//1=Car
映射(x=>x.MaxSpeed)
.列(“MaxSpeed”)
.CustomType(“十进制”)
.Access.Property()
.Generated.Never()
.默认值(@“0”)
.精度(19)
.比额表(4);
}
}
飞机使用子类映射类似于汽车

由于Envers正在尝试为这两个子类创建Vehicle表,因此似乎发生了错误。我尝试了不同的变化,包括/不包括车辆类别以进行审核

我的第一个问题是Envers是否支持每类使用表继承?如果有,有人能给我指一下如何为每个类的表配置它的示例/文档吗


谢谢。

我们同时使用Envers和table per class方法,我们通常映射基类,然后使用Join table定义派生类 试着这样做:

public class VehicleMap : ClassMap<Vehicle>
{
  public VehicleMap() {
   Table("Vehicle");
   Id(_ => _.Id, "VehicleId")...
   DiscriminateSubClassesOnColumn("VehicleTypeId");
   ...
}
公共类车辆地图:类地图
{
公共车辆地图(){
表(“车辆”);
Id(=>.Id,“VehicleId”)。。。
区分子类别子列(“车辆类型ID”);
...
}
汽车呢

public class CarMap : SubclassMap<Car>
{
  public CarMap() {
    Table("cars");
    DiscriminatorValue(1);
    Join("cars", part => {
      part.KeyColumn("VehicleId");
      part.Map(x => x.MaxSpeed)  ... 
公共类CarMap:子类映射
{
公共CarMap(){
表(“cars”);
鉴别器值(1);
加入(“汽车”,部分=>{
第.部分KeyColumn(“车辆ID”);
part.Map(x=>x.MaxSpeed)。。。
这相当于第9.1.2节中描述的映射


对于Envers,只需添加包括基本类型在内的所有类型。

事实证明,我们正在使用Envers还不支持的鉴别器属性映射类。我们的鉴别器列映射到另一个对象/表,而不是基本类型。我们提交了一个小补丁来添加对它的支持

我们将discriminator的insert属性设置为false,以便NHibernate知道该列映射到另一个类

插入(可选-默认为true):如果 鉴别器列也是映射复合标识符的一部分


Envers生成的审核表映射不包含此设置,因此当NHibernate加载生成的类映射时,它尝试为基类和子类创建属性。这就是我们遇到的问题的原因。我们提交的修补程序查找此类映射,然后添加
插入=“错"
属性到discriminator元素。

我查看了Envers的源代码,它似乎确实支持使用类继承。因此,我当前的想法是我配置了错误的内容。我将查看是否可以链接到Envers源代码并跟踪发生的情况。是的,所有类型的继承映射都可用在nhib核心中,应得到nhib envers AFAIK的支持。