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

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声明移到派生类中(并导致大量重复)?

更新:
我接受了下面的替代答案,但仍然坚持认为自动映射应该考虑没有替代的集合。为了解决这个特定问题,我最终要做的是转到一个单独的表,而不是每个子类的表。这样做可以使事物正确自动映射。

最佳答案

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

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


将其添加到您的自动映射配置中,应使其遵循尽可能多的约定,但也应遵循明确规定。

10-08 13:04