0

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

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 的所有属性(自身,加上继承的)都映射到单个表 UserImplEx 中,而不是拆分为两个表?

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

4

1 回答 1

0

选项1

因为你在这里有继承并希望返回正确的类型,所以 NH 必须将类型存储在某处,要么通过数据所在的表,要么通过鉴别器。

如果表中的鉴别器列无关紧要,则添加DiscriminatorColumn("userType", "user");inUserImplMapDiscriminatorValue("userEx")inUserImplExMap

选项 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);
})
于 2013-07-18T06:18:21.280 回答