传统映射中的NHibernate映射错误

时间:2011-07-06 10:42:46

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我继承了一大堆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");
});

1 个答案:

答案 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);
}

然后一切正常,就像我从一开始就期望的那样。