假设我有一个定义如下的抽象基类:
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));
将其添加到您的自动映射配置中,应使其遵循尽可能多的约定,但也应遵循明确规定。