2011-05-24 46 views
3

我有这两个类:流利NHibernate:地图属性没有外键?

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作为父。

父数据库与子数据库之间没有外键。

(我不想使用两种不同的存储库,我想在映射功能)

是财产裁判的东西,我可以使用?

回答

1

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

Here是忽略FluentNhibernate中的属性的线程。

+0

如果不使用自动映射,我真的需要忽略该属性吗? – Awesome 2011-05-24 07:55:48

+0

如果未使用automapping,则不需要忽略该属性。 – 2011-05-24 08:09:24

+0

你能举个例子吗? – Awesome 2011-05-24 08:53:24

2

一种策略是强制在孩子们的收集器上进行急切加载并创建另一个属性来获得最大的孩子。

Property-Ref用于使用不是主键的列连接到另一个表。

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),然后从儿童表行中加入。

+0

谢谢你的建议,马克。有可能在映射中执行OrderBy功能吗? – Awesome 2011-05-25 07:41:47

+0

您可以使用映射上的'.AsSet'方法为您提供与IList相对的orderedSet。所以是的,有些选项可以通过BirthDate来订购你的孩子,并按照正确的顺序出现在“Children”中。 – 2011-09-02 11:03:59

相关问题