.NET 4.6中的NHibernate代码映射抛出“无法扩展未映射的类”

时间:2015-07-09 15:00:19

标签: c# nhibernate mapping-by-code .net-4.6

我的项目运行了几个月,我今天在干净安装的Windows上安装了相同的NH配置(安装了VS 2015 RC,安装了.NET 4.6 RC,但项目的目标是.NET 4.5)

在这些线路被称为NH会话工厂的建设时:

var mapper = new AutoMapper();
var mapping = mapper.CompileMappingFor(typeof(Entity).Assembly.GetTypes());
conf.AddMapping(mapping);

最后一行抛出异常:Could not compile the mapping document: mapping_by_code,其中包含InnerException Cannot extend unmapped class: [my_namespace].[my_entity_name]。当我遍历mapping时,我可以看到名称为[my_entity_name]的对象,一切似乎都可以。只有这个对象在扩展此对象的对象之后才会被收集(我不确定它是否可能是一个问题,或者顺序无关紧要。)

在任何其他计算机(其他工作站,CI服务器,生产环境和开发环境)上我们没有注意到这个错误,我想它可能是由安装的.NET 4.6引起的,这是唯一一台带有.NET 4.6的机器。如果在安装.NET 4.6时我理解正确,那么所有针对.NET 4.5的项目都在.NET 4.6运行时中运行。我也尝试在VS 2013中运行它,但没有变化......我也在检查.NET 4.6RC更新日志,但我没有找到任何可能导致此错误的内容。有什么建议吗?

更新:我在.NET 4.5机器上检查了mapping集合中项目的顺序,它的顺序是正确的(依赖子类在父子类之后),所以看来GetTypes()返回的类型的顺序(没有保证排序)巧合地在.NET 4.5中工作,但在.NET 4.6中不起作用,因为CompileMappingFor不重新排序相同类型的映射(这里我有依赖关系) SubClass - > SubClass)。

1 个答案:

答案 0 :(得分:4)

是的,原因是{4.5}和.NET 4.6中Assembly.GetTypes()的顺序完全不同。巧合的是,.NET 4.5生成的订单正在运行......我将其修改为以下代码段并且可以正常工作。

var types = typeof (Entity).Assembly.GetTypes().Where(t => !t.IsInterface).PartialOrderBy(x => x, new EntityTypeComparer());
var mapping = mapper.CompileMappingFor(types);    

public class EntityTypeComparer : IComparer<Type>
{
    public int Compare(Type x, Type y)
    {           
        if (x == y)
            return 0;
        if (x.IsAssignableFrom(y) || (!x.IsAssignableTo<Entity>() && y.IsAssignableTo<Entity>()))
            return -1;
        if (y.IsAssignableFrom(x) || (!y.IsAssignableTo<Entity>() && x.IsAssignableTo<Entity>()))
            return 1;
        return 0;
    }
}      

编辑: OrderBy已替换为PartialOrderBy,您可以在此处找到实施 - Topological Sorting using LINQ。这使得拓扑排序而不是常规排序 - 我们有那些不可比较的对象(比较器中的最后返回0)和一般的OrderBy会产生错误的结果。