0

私は、既存の機能的なアプリケーションに存在するNHibernateマッピングの大規模なセットを継承しました。このアプリケーションを分岐していくつかの新機能を開発しましたが、その一方で、よりTDDのようなアプローチを可能にするためにテストインフラストラクチャも拡張しています。しかし今、私は統合テストの1つで壁にぶつかりました...

統合テストの前に挿入するテストデータを含むクラスがあります。これらを挿入するメソッドでは、次の例外が発生します。

NHibernate.PropertyAccessException:無効なキャスト(プロパティタイプの不一致についてマッピングを確認してください); Domain.Entities.Projectのセッター--->System.InvalidCastException:タイプ「System.Object」のオブジェクトをタイプ「Domain.Entities.ProjectModules」にキャストできません。

理由がわかりません。セットアップ時にデータベースに永続化しようとする2つの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 に答える