我创建了一个通用的用户存储库基类,它提供了可重用的用户管理功能。
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排除特定的映射类?
答案 0 :(得分:0)
因为你在这里有一个并且想要正确的类型,所以NH必须在某个地方存储类型,无论是通过数据所在的表还是鉴别器。
如果表格中的鉴别器列无关紧要,请在DiscriminatorColumn("userType", "user");
和UserImplMap
中DiscriminatorValue("userEx")
添加UserImplExMap
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);
})