为 NHibernate 添加对象映射不起作用
Adding object mappings for NHibernate not working
我正在使用 NHibernate 4 设置 .Net MVC WebApplication。
我所有的模型都在一个单独的项目中,我正在尝试添加所有这些 class 映射。问题是没有添加映射。
这是我的代码:
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:'映射 class 必须是 IConformistHoldersProvider 的实现。
参数名称:type'
不确定,但您可能会得到实际上不是 ClassMapping
的类型。这就是您的例外情况:
System.ArgumentOutOfRangeException: 'The mapping class must be an implementation of IConformistHoldersProvider. Parameter name: type'
只需过滤列表如下:
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();
您似乎正在通过 NHibernate.Mapping.Attributes
nuget 包使用属性映射。
在这种情况下,您需要按照 here 的说明添加映射,而不是调用 modelMapper.AddMappings
。类似于:
// Instead of modelMapper.AddMappings use this:
cfg.AddInputStream(
NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
typeof(MyObject).Assembly));
// Now you can use this configuration to build your SessionFactory...
ModelMapper
class 是必需的,并且仅适用于 Mapping ByCode(如命名空间 NHibernate.Mapping.ByCode
建议的那样)。
我正在使用 NHibernate 4 设置 .Net MVC WebApplication。 我所有的模型都在一个单独的项目中,我正在尝试添加所有这些 class 映射。问题是没有添加映射。 这是我的代码:
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:'映射 class 必须是 IConformistHoldersProvider 的实现。 参数名称:type'
不确定,但您可能会得到实际上不是 ClassMapping
的类型。这就是您的例外情况:
System.ArgumentOutOfRangeException: 'The mapping class must be an implementation of IConformistHoldersProvider. Parameter name: type'
只需过滤列表如下:
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();
您似乎正在通过 NHibernate.Mapping.Attributes
nuget 包使用属性映射。
在这种情况下,您需要按照 here 的说明添加映射,而不是调用 modelMapper.AddMappings
。类似于:
// Instead of modelMapper.AddMappings use this:
cfg.AddInputStream(
NHibernate.Mapping.Attributes.HbmSerializer.Default.Serialize(
typeof(MyObject).Assembly));
// Now you can use this configuration to build your SessionFactory...
ModelMapper
class 是必需的,并且仅适用于 Mapping ByCode(如命名空间 NHibernate.Mapping.ByCode
建议的那样)。