流利的nHibernate SubclassMap和AddFromAssemblyOf

时间:2013-07-17 00:03:35

标签: nhibernate fluent

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

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

}

我有一个名为UserImpl的IUser的具体实现,以及相应的映射class UserImplMap : ClassMap<UserImpl>(它们都位于相同的命名空间和程序集中)。我使用AddFromAssemblyOf添加映射。我也用它来创建/生成模式。

到目前为止,这么好,事情按预期工作。

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

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

是否可以以某种方式配置/编码Fluent映射,以便将UserImplEx的所有属性(self,plus inherited)映射到单个表UserImplEx而不是分成两个表?

或者,如果我在UserImplExMap : ClassMap<UserImplEx>中提供完整映射,那么我确实可以获得所需的模式,但我还获得了UserImpl的附加表(因为UserRepository程序集中存在相应的映射)。如果我遵循这种方法,有没有办法告诉AddFromAssemblyOf排除特定的映射类?

1 个答案:

答案 0 :(得分:0)

选项1

因为你在这里有一个并且想要正确的类型,所以NH必须在某个地方存储类型,无论是通过数据所在的表还是鉴别器。

如果表格中的鉴别器列无关紧要,请在DiscriminatorColumn("userType", "user");UserImplMapDiscriminatorValue("userEx")添加UserImplExMap

选项2

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);
})