旧映射中的NHibernate映射错误

旧映射中的NHibernate映射错误,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,我继承了一大组NHibernate映射,它们存在于现有的功能性应用程序中。我已经将这个应用程序进行了分支,以开发一些新功能,同时我也扩展了测试基础设施,以允许采用更类似于TDD的方法。但现在我在一次集成测试中遇到了麻烦 我有一个带有测试数据的类,我在集成测试之前插入了这些数据。在插入这些的方法中,我得到以下异常: NHibernate.PropertyAccessException:无效强制转换(检查映射中的属性类型不匹配);Domain.Entities.Project的setter-->Sy

我继承了一大组NHibernate映射,它们存在于现有的功能性应用程序中。我已经将这个应用程序进行了分支,以开发一些新功能,同时我也扩展了测试基础设施,以允许采用更类似于TDD的方法。但现在我在一次集成测试中遇到了麻烦

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

NHibernate.PropertyAccessException:无效强制转换(检查映射中的属性类型不匹配);Domain.Entities.Project的setter-->System.InvalidCastException:无法将“System.object”类型的对象强制转换为“Domain.Entities.ProjectModule”类型

我不知道为什么。我有两个
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
    });
});
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");
});
Fluent NHibernate映射的(相关部分)如下所示:

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
    });
});
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");
});

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

Component(p => p.ProjectModules);
并将以下类添加到我的映射程序集中:

public class ProjectModulesMap : ComponentMap<ProjectModules>
{
    LazyLoad.Always();
    Map(pm => pm.ModuleOne);
    Map(pm => pm.ModuleTwo);
}
公共类项目模块映射:组件映射
{
LazyLoad.Always();
Map(pm=>pm.ModuleOne);
Map(pm=>pm.modulewo);
}

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

只是好奇,但这是您添加的新映射,还是在新版本的Fluent NH下无法工作的先前映射?还是这段旧代码根本就不起作用?@Cole:这段映射很旧,我也没有改变它或FNH的版本。我不认为曾经有过像我试图构建的集成测试那样的工作,我已经创建了新的测试数据(使用旧类)。但是这些映射与FNH的相同版本在生产环境中使用,用户没有抱怨:PNice!这么说来,用户正在生产中创建新项目,对吗?如果是这样,他们在创建对象的方式上是否存在差异?除非他们不在生产中创建这些对象,否则我看不出您的集成测试会有什么不同。如果是不同的,也许发现这些差异会帮助你找到答案。@Cole:Hm。。。事实证明,应用程序中项目的保存代码毕竟没有使用NHibernate-项目是使用存储过程插入的,该存储过程与我们尝试迁移的其他遗留DAL一起使用。。。