为 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 建议的那样)。