流畅的NHibernate不会在基类中自动映射一对多属性

时间:2011-03-31 19:32:56

标签: c# fluent-nhibernate automapping

假设我有一个定义如下的抽象基类:

public abstract class CompanyBase : EntityBase<CompanyBase>
{
    public virtual string Name { get; set; }
    public virtual StreetAddress Address { get; set; }
    public virtual IEnumerable<PhoneNumber> PhoneNumbers { get; set; }
}

然后我创建了几个派生自这个类的类,如下所示:

public class CustomerCompany : CompanyBase
{
    // Properties relevant to a customer
}

public class VendorCompany : CompanyBase
{
    // Properties relevant to a vendor
}

每个派生类都有自己的表 - 在此示例中 CustomerCompany VendorCompany 。没有 CompanyBase 表。

我通过Fluent NHibernate设置了自动映射,忽略了基类,并且除了以外的PhoneNumbers属性。它在导出时不会显示在hbm文件中,也不会从数据库中提取。看起来它只是俯瞰那个属性。如果我将PhoneNumbers属性放在派生类上,一切都很好。

我无法在互联网上找到与此相关的任何内容......有没有人见过这个?有没有办法解决它或者我必须将PhoneNumbers声明移到派生类中(并最终导致大量重复)?

更新
我接受了下面的覆盖答案,但仍然认为自动化应考虑集合而不会覆盖。我最终要解决这个特定问题的方法是转到单个区分表而不是每个子类的表。这样做可以让事情自动化。

2 个答案:

答案 0 :(得分:0)

您始终可以覆盖约定。自动映射非常特殊,只能检测它已经知道要查找的内容以及您另外告诉它的内容:

mappings
   .Override<CustomerCompany>(m=>m.HasMany(x=>x.PhoneNumbers))
   .Override<VendorCompany>(m=>m.HasMany(x=>x.PhoneNumbers));

将此添加到您的自动配置配置应该遵循尽可能多的约定,但也要按照具体说明进行。

答案 1 :(得分:0)

你可以尝试一件事......

将PhoneNumbers的类型从IEnumerable更改为IList。然后,我希望所有派生类都继承列表,而不需要约定或覆盖。

根据经验我知道IList得到了FNH Automapping的良好支持 - 对IEnumerable不太确定。