我继承了一大堆NHibernate映射,这些映射存在于现有的功能应用程序中。我已经将这个应用程序分支开发了一些新功能,虽然我这样做,但我也扩展了测试基础设施,以允许更像TDD的方法。但是现在我在我的一个集成测试中遇到了障碍......
我有一个包含测试数据的类,我在集成测试之前插入它。在插入这些的方法中,我得到以下异常:
NHibernate.PropertyAccessException:无效的转换(检查映射是否存在属性类型不匹配); Domain.Entities.Project的设定者---> System.InvalidCastException:无法将类型为“System.Object”的对象强制转换为“Domain.Entities.ProjectModules”。
我无法弄明白为什么。我有两个Project
个实例,我尝试在设置数据库中保留这两个实例,这两个实例都定义如下:
new Project("2023", "projeName", "projaddr")
{
PrincipalOwner = UserOne, // UserOne and Office are other properties
Office = Office,
// I've tried just not instantiating this too - gave the same exception
ProjectModules = new ProjectModules
{
HasModuleOne = false,
HasModuleTwo = false
});
});
Fluent NHibernate映射的(相关部分)如下所示:
Component(m => m.ProjectModules, c =>
{
c.LazyLoad();
c.Map(x => x.HasModuleOne)
.Column("ModuleOne").Not.Nullable().Default("0");
c.Map(x => x.HasModuleTwo)
.Column("ModuleTwo").Not.Nullable().Default("0");
});
答案 0 :(得分:1)
我已经解决了这个问题 - 出于某种原因,NHibernate不喜欢在Projects的映射中内联指定组件映射时,但是如果我将映射移动到单独的类ComponentMap<T>
,它就可以了。所以我将有问题的行改为
Component(p => p.ProjectModules);
并将以下类添加到我的映射程序集中:
public class ProjectModulesMap : ComponentMap<ProjectModules>
{
LazyLoad.Always();
Map(pm => pm.ModuleOne);
Map(pm => pm.ModuleTwo);
}
然后一切正常,就像我从一开始就期望的那样。