0

我继承了存在于现有功能应用程序中的大量 NHibernate 映射。我已经对这个应用程序进行了分支以开发一些新功能,同时我也在扩展测试基础架构以允许更类似于 TDD 的方法。但现在我在我的一个集成测试中碰壁了......

我有一个带有测试数据的类,我在集成测试之前插入了它。在插入这些的方法中,我得到以下异常:

NHibernate.PropertyAccessException: Invalid Cast (检查你的映射是否有属性类型不匹配); Domain.Entities.Project 的 setter ---> 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");
});
4

1 回答 1

1

我已经解决了这个问题——由于某种原因,NHibernate 不喜欢在项目映射中内联指定组件映射,但是如果我将映射移动到一个单独的类ComponentMap<T>,它就可以工作。所以我将有问题的行改为

Component(p => p.ProjectModules);

并将以下类添加到我的映射程序集中:

public class ProjectModulesMap : ComponentMap<ProjectModules>
{
    LazyLoad.Always();
    Map(pm => pm.ModuleOne);
    Map(pm => pm.ModuleTwo);
}

然后一切都按照我从一开始就预期的那样工作。

于 2011-07-07T11:19:57.973 回答