我正在学习NHibernate,以便将它分层放在一个相当奇特的遗留数据库上。其他应用程序使用相同的实时数据库,因此我无法进行会影响它们的更改。
我遇到了一个问题,因为一个代表硬件设备的表有两列用作事实上的主键。一个是真正的主键,一个自动生成的行ID。另一个是唯一且非空的硬件序列号。
数据库中的许多其他表与此表具有外键关系。但是,其中一些使用真正的主键 - 整数行id - 作为外键,而有些则使用设备的硬件ID。
请注意,实际上,硬件ID和行ID一旦配对,将保持配对。
我能否在NHibernate中创建映射来处理这个问题,还是需要创建一些视图来为我提供更标准化的模式,并使用INSTEAD OF触发器使它们可以更新?
正在使用的数据库是MSSQL 2000,以防万一。
答案 0 :(得分:1)
在你的情况下,我会做以下事情:
public class HardwareDevice{
public virtual int Id {get; set;}
public virtual string SerialNumber {get; set;}
//Other stuff
}
public class DomainThingA {
public virtual int Id {get; set;}
public virtual HardwareDevice Device {get; set;}
//Other stuff
}
public class DomainThingB {
public virtual int Id {get; set;}
public virtual HardwareDevice Device {get; set;}
//Other stuff
}
使用AutoGenerated Id作为主键映射您的HardwareDevice类。 我的例子使用FluentNhibernate作为类映射。
public class HardwareDeviceMap : ClassMap<HardwareDevice> {
public HardwareDeviceMap(){
Id(x=>x.Id).GeneratedBy.Native().Column("Id"); //Uses auto number
Map(x=>x.SerialNumber).Column("SerialNumber");
//Other mappings
}
}
现在用于映射其他两个类:
public class DomainThingAMap : ClassMap<DomainThingA> {
public DomainThingAMap(){
Id(x=>x.Id).GeneratedBy.Native(); //Uses auto number
References(x=>x.Device)
.Column("DeviceId"); //Joins on Id in HardwareDevice Table by default
//Other mappings
}
}
public class DomainThingBMap : ClassMap<DomainThingB> {
public DomainThingBMap(){
Id(x=>x.Id).GeneratedBy.Native(); //Uses auto number
References(x=>x.Device)
.Column("SerialNumber") //Column in DomainThingB Table
.PropertyRef("SerialNumber"); //Joins using SerialNumber column (hardware device table)
//Other mappings
}
}
类映射的Property-Ref功能允许您加入不是这些类型的遗留数据库目的的主键的列。