You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Fluent NHibernate中,单表仅一列时如何双向关联两个实体?

在Fluent NHibernate中实现Room到Booking的反向关联(无需新增列)

完全可行,你只需要基于现有Booking表中的IDBookedRoom外键,建立反向关联即可,不需要在Room表添加任何新列。以下是具体实现步骤:

1. 更新实体类

根据你的业务场景(一个Room对应多个/单个Booking),修改Room类:

场景A:一个Room对应多个Booking(常规预订场景)

public class Room {
     public virtual int ID { get; set; }
     // 添加Booking集合,构造函数初始化避免空引用
     public virtual ICollection<Booking> Bookings { get; set; }

     public Room()
     {
         Bookings = new List<Booking>();
     }
     // 其他属性...
}

场景B:一个Room对应单个Booking(比如当前有效预订)

public class Room {
     public virtual int ID { get; set; }
     public virtual Booking CurrentBooking { get; set; }
     // 其他属性...
}

2. 配置Fluent NHibernate映射

对应场景A的映射(一对多反向关联)

修改RoomMap,添加HasMany配置,指定外键列并标记反向维护:

public class RoomMap : ClassMap<Room>{
        public RoomMap()
        {
             Table("Room");
             Id(t => t.ID).GeneratedBy.Identity();
             // 反向关联Booking集合,外键在Booking表的IDBookedRoom列
             HasMany(x => x.Bookings)
                 .KeyColumn("IDBookedRoom")
                 .Inverse() // 标记关联由Booking端维护(因为外键在Booking表)
                 .Cascade.All(); // 根据业务需求调整级联策略,比如None/DeleteOrphan等
        }
}

对应场景B的映射(一对一反向关联)

如果是一对一场景,使用HasOne并指定关联属性:

public class RoomMap : ClassMap<Room>{
        public RoomMap()
        {
             Table("Room");
             Id(t => t.ID).GeneratedBy.Identity();
             // 一对一反向关联,基于Booking的BookedRoom属性
             HasOne(x => x.CurrentBooking)
                 .PropertyRef(x => x.BookedRoom)
                 .Cascade.All();
        }
}

关键说明

  • Inverse():核心配置,告诉NHibernate关联关系的维护权在Booking端(因为外键存储在Booking表),避免NHibernate尝试从Room端更新外键导致错误。
  • KeyColumn("IDBookedRoom"):明确指定外键列与BookingMap中的References(t=>t.BookedRoom).Column("IDBookedRoom")完全对应。
  • 级联策略:根据业务需求选择,比如删除Room时不需要删除关联Booking就用Cascade.None,需要级联删除就用Cascade.AllDeleteOrphan。

内容的提问来源于stack exchange,提问作者Brodeeno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:07:37