我该如何映射:
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"))
私有字段在简单属性映射但集合映射中工作正常 是完全不同的。任何的想法?感谢
答案 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"));