在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
相关产品推荐
相关产品推荐

