私人收藏映射流畅的nhibernate

时间:2009-04-23 12:13:01

标签: fluent-nhibernate

我该如何映射:

public class Customer
{
   private IList<Order> _orders;
   public IEnumerable<Order> 
   GetAllOrders()
   {
      return _orders;     
   }
}

在项目页面上有一些样本,但没有关于这种情况。 有这个样本:

// model   
public class Account   
{   
  private IList<Customer> customers = new List<Customer>();   

  public IList<Customer> Customers   
  {   
    get { return customers; }   
  }   
}

// mapping   
HasMany(x => x.Customers)   
  .Access.AsCamelCaseField();  

但它假设Account拥有公共领域的客户,并且该方案与我的不同。我尝试了一些可能的选项但没有效果:

HasMany(x => Reveal.Propertie("_orders"))

私有字段在简单属性映射但集合映射中工作正常 是完全不同的。任何的想法?感谢

3 个答案:

答案 0 :(得分:24)

最简单的解决方案是将您的集合公开为公共属性Orders而不是GetAllOrders()方法。然后您的映射是

HasMany(x => x.Orders)
    .Access.AsCamelCaseField(Prefix.Underscore);

你的班级是

public class Customer
{
    private IList<Order> _orders = new List<Order>();

    public IEnumerable<Order> Orders 
    { 
        get { return _orders; }
    }
}

如果这对您不起作用,可以使用Fluent NHibernate的Reveal映射map private properties

编辑添加:刚刚完成此操作,正确的答案是:

HasMany<Order>(Reveal.Property<Customer>("_orders")) etc.

必须将集合公开为受保护的虚拟属性才能允许代理:

protected virtual IList<Order> _orders { get; set; }

This answer让我走上正轨。

答案 1 :(得分:1)

感谢。 你的解决方案很好。但是,当您不想透露您的私人收藏时,可能会出现(低调)情况。您的链接帖子中没有解释此映射方案,因为在该帖子中描述的简单属性与集合映射之间存在差异。由于引发异常,我尝试使用HasMany(x =&gt; Reveal.Propertie(“_ orders”))失败。

答案 2 :(得分:1)

您可以使用Reveal.Member()映射完全私有的集合,但它有一个特定且非显而易见的限制:Expression接受的HasMany()必须返回IEnumerable<TReferenced>object

对于你的班级:

public class Customer
{
    private IList<Order> _orders;
    public IEnumerable<Order> GetAllOrders()
    {
        return _orders;     
    }
}

以下行将填充_orders集合:

HasMany(Reveal.Member<Customer, IEnumerable<Order>>("_orders"));
    //additional mapping behaviors

为了完整性 - 以下行给出了编译器错误:

HasMany(Reveal.Member<Customer, IList<Order>>("_orders"));