首页 > 解决方案 > 为 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 的实现。参数名称:类型'

标签: c#nhibernate

解决方案


不确定,但您可能会得到那些实际上不是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();

推荐阅读