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