我的项目运行了几个月,我今天在干净安装的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)。
答案 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会产生错误的结果。