【问题标题】:NHibernate on a table with two "primary" keysNHibernate 在具有两个“主”键的表上
【发布时间】:2011-09-26 13:13:11
【问题描述】:

我正在学习 NHibernate,以便将它分层到一个相当奇特的遗留数据库上。其他应用程序使用相同的实时数据库,因此我无法进行会影响它们的更改。

我遇到了一个问题,因为一个代表硬件设备的表有两列用作事实上的主键。一个是真正的主键,一个自动生成的行 ID。另一个是唯一且非空的硬件序列号。

数据库中的许多其他表与该表具有外键关系。但是,其中一些使用真正的主键 - 整数行 id - 作为外键,而另一些则使用设备的硬件 id。

请注意,在实践中,硬件 ID 和行 ID 一旦配对,将保持配对。

我是否能够在 NHibernate 中创建映射来处理这个问题,或者我需要创建一些视图来给我一个更标准化的架构,并使用 INSTEAD OF 触发器使它们可更新?

使用的数据库是 MSSQL 2000,以防万一。

【问题讨论】:

    标签: database nhibernate mapping primary-key legacy-database


    【解决方案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 功能允许您连接不是这些类型的遗留数据库的主键的列。

    【讨论】:

      猜你喜欢
      • 2011-06-09
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      相关资源
      最近更新 更多