Fluent NHibernate:不带外键的映射属性

本文关键字:映射 属性 NHibernate Fluent | 更新日期: 2023-09-27 17:57:24

我有两个类:

public class Parent
{
    public virtual string Name { get; set; }
    public virtual string Family_id { get; set; }
}
public class Children
{
    public virtual string Name { get; set; }
    public virtual DateTime BirthDate { get; set; }
    public virtual string Family_id { get; set; }
}
当我获取父项

时,我还想获取与父项具有相同Family_id的最年长(按出生日期排序)子项。

数据库中的父项和子项之间没有外键。

(我不想使用两个不同的存储库,我想要映射中的功能)

属性引用是我可以使用的东西吗?

Fluent NHibernate:不带外键的映射属性

一种策略是对子项集合强制执行预先加载,并创建另一个属性来获取年龄最大的子项。

属性引用用于使用非主键的列连接到另一个表。

public class Parent
{
    public virtual int Id {get; set;}
    public virtual string Name { get; set; }
    public virtual string Family_id { get; set; }
    public virtual Children OldestChild {
     get {
          return Children.OrderBy(x=>x.BirthDate).FirstOrDefault();
     }}
    public virtual IList<Children> Children {get; set;}
}
public class ParentMap : ClassMap<Parent>{
    public ParentMap(){
        Id(x=>x.Id);
        Map(x=>x.Name);
        HasMany(x=>x.Children).PropertyRef("Family_id").Fetch.Join();
    }
}

另一种可能性是将一列添加到父表 (OldestChild_FK),然后从 Children 表中联接该行。

我认为您要做的是在父级上创建一个名为 OldestChild 的属性或最年长的子项列表并忽略该属性并编写一些自定义查询(HQL 或 SQL)以返回您想要的结果。

这里有一个关于忽略FluentNhibernate属性的线程。