c# - 为 NHibernate 添加对象映射不起作用
问题描述
我正在使用 NHibernate 4 设置一个 .Net MVC WebApplication。我所有的模型都在一个单独的项目中,我正在尝试添加所有这些类映射。问题是没有添加映射。这是我的代码:
var cfg = new Configuration().DataBaseIntegration(db =>
{
db.ConnectionStringName = <ConnectionName>;
db.Dialect<NHibernate.Dialect.MsSql2012Dialect>();
});
var mapper = new ModelMapper();
var types = typeof(MyObject).Assembly.GetTypes().Where(t => t.GetCustomAttributes().Any(attr => attr is ClassAttribute classAttribute)).ToList();
mapper.AddMappings(types);
HbmMapping domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities();
cfg.AddMapping(domainMapping);
cfg.BuildMappings();
SessionFactory = cfg.BuildSessionFactory();
types
包含所有正确的映射,但显然mapper.AddMappings(types);
没有正确绑定它们。cfg.ClassMappings
包含0
条目。
我已经阅读了许多示例,但它们使用相同的方法来添加这些映射。
使用以下代码显式添加每种类型的映射时:
foreach(var type in types)
{
mapper.AddMapping(type);
}
我收到以下异常:System.ArgumentOutOfRangeException:'映射类必须是 IConformistHoldersProvider 的实现。参数名称:类型'
解决方案
不确定,但您可能会得到那些实际上不是ClassMapping
. 这就是你的例外所说的:
System.ArgumentOutOfRangeException: '映射类必须是 IConformistHoldersProvider 的实现。参数名称:类型'
只需过滤列表如下:
var types = typeof(MyObject).Assembly.GetTypes()
.Where
(t =>
t.BaseType != null &&
t.BaseType.IsGenericType &&
t.BaseType.GetGenericTypeDefinition() == typeof(ClassMapping<>)
);
var modelMapper = new ModelMapper();
modelMapper.AddMappings(types);
HbmMapping hbmMapping = modelMapper.CompileMappingForAllExplicitlyAddedEntities();
configuration.AddMapping(hbmMapping);
configuration.BuildMappings();