私人收藏映射流畅的nhibernate

7 fluent-nhibernate

我该如何映射:

public class Customer
{
   private IList<Order> _orders;
   public IEnumerable<Order> 
   GetAllOrders()
   {
      return _orders;     
   }
}
Run Code Online (Sandbox Code Playgroud)

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

// 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();  
Run Code Online (Sandbox Code Playgroud)

但它假设Account有公共领域的客户,那个场景与我的不同.我尝试了一些可能的选项但没有效果:

HasMany(x => Reveal.Propertie("_orders"))
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*Ide 24

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

HasMany(x => x.Orders)
    .Access.AsCamelCaseField(Prefix.Underscore);
Run Code Online (Sandbox Code Playgroud)

而你的班级是

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

    public IEnumerable<Order> Orders 
    { 
        get { return _orders; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这对您不起作用,则可以使用Fluent NHibernate的Reveal映射来映射私有属性.

编辑补充:刚做完这个,正确的答案是:

HasMany<Order>(Reveal.Property<Customer>("_orders")) etc.
Run Code Online (Sandbox Code Playgroud)

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

protected virtual IList<Order> _orders { get; set; }
Run Code Online (Sandbox Code Playgroud)

这个答案让我走上正轨.