Fluent nHibernate子类映射和AddFromAssemblyOf

Fluent nHibernate子类映射和AddFromAssemblyOf,nhibernate,fluent,Nhibernate,Fluent,我创建了一个提供可重用用户管理功能的通用用户存储库基类 public class UserRepository<TUser> where TUser : new, IUser { } 公共类用户存储库,其中TUser:new,IUser { } 我有一个名为UserImpl的IUser的具体实现,以及相应的映射classuserimplmap:ClassMap(它们都在相同的名称空间和程序集中)。我使用AddFromAssemblyOf添加映射。我还使用它来创建/生成模式 到目

我创建了一个提供可重用用户管理功能的通用用户存储库基类

public class UserRepository<TUser> where TUser : new, IUser
{

}
公共类用户存储库,其中TUser:new,IUser { } 我有一个名为UserImpl的IUser的具体实现,以及相应的映射
classuserimplmap:ClassMap
(它们都在相同的名称空间和程序集中)。我使用AddFromAssemblyOf添加映射。我还使用它来创建/生成模式

到目前为止一切都很好,一切正常

现在,在另一个项目中,我需要在IUser实现类中添加一些属性,因此我实现了一个新的
类UserImplEx:UserImpl
。这个类具有我需要的附加属性。此外,我还创建了一个新的映射
类UserImplExMap:SubclassMap

现在,当我使用这种方法创建模式时,我得到两个表,一个用于UserImpl,另一个用于UserImplEx

是否可以以某种方式配置/编码Fluent映射,以便将UserImplEx的所有属性(自身属性和继承属性)映射到单个表UserImplEx中,而不是拆分为两个表

或者,如果我在
UserImplExMap:ClassMap
中提供了完整的映射,那么我会根据需要获取模式,但我也会为UserImpl获取一个额外的表(因为相应的映射存在于UserRepository程序集中)。如果我采用这种方法,有没有办法告诉AddFromAssemblyOf排除特定的映射类?

选项1 因为您在这里有inhertance并希望返回正确的类型,所以NH必须将该类型存储在某个位置,或者通过数据所在的表或鉴别器

如果表中的鉴别器列不重要,则添加
鉴别器列(“用户类型”、“用户”)
UserImplExMap
DiscriminatorValue(“userEx”)
UserImplExMap

选择2
谢谢你的建议。鉴别器列将是不必要的开销。由于项目中不会有任何其他类型的用户,如果没有额外的列/表拆分(在这种情况下会导致一对一的映射),是否不可能做到这一点?或者当我在UserImplExMap中提供完整映射时,至少排除/抑制UserImplMap的映射?我将添加另一个选项Tanks。我试试看。在翻阅nHibernate食谱时,我遇到了一个选项“每个具体类的表”。我在找这样的东西。从书中可以看出,在nHibernate中,可以通过使用“联合子类”来实现它。我想知道是否有使用Fluent?的等效选项?好的,我想我找到了一种方法-还没有尝试过。本文中建议了一个选项“UseUnionSubclass ForInheritanceMapping”,它还将创建2个表。使用sql联合组合的用户和用户性别
class MyTypeSource : ITypeSource
{
    private ITypeSource _inner = new AssemblyTypeSource(typeof(UserImplMap).Assembly);

    public IEnumerable<Type> GetTypes()
    {
        return _inner.Where(t => t != typeof(UserImplMap)).Concat(new [] { typeof(UserImplExMap) });
    }
    public void LogSource(IDiagnosticLogger logger)
    {
        _inner.LogSource(logger);
    }
    public string GetIdentifier()
    {
        return _inner.GetIdentifier();
    }
}
.Mappings(m =>
{
    var model = new PersistenceModel();
    PersistenceModel.AddMappingsFromSource(new MyTypeSource());
    m.UsePersistenceModel(model);
})