0

モジュールを動的にロードできる動的WebサイトにNHibernateを使用しているため、sessionFactoryを構築する場合は、すべてのアセンブリを見つけて依存関係でソートする方法を使用し、作成したConfigurationインスタンスに追加してできます。ここで、構成タイプを hbm.xml ファイルから流暢に変更したいので、以下のコードを追加します。

 sessionFactory =
    Fluently
    .Configure()
    .Database(
        FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008.ConnectionString(
            c =>  c.FromAppSetting("connectionString")
        )
    )
    .Mappings(
        m => m.AutoMappings.Add(
            AutoMap.Assemblies(
                new FarayanConfig(),
                assembliesArray
            )
        )
   ).BuildSessionFactory();

FarayanConfig は次のとおりです。

class FarayanConfig : DefaultAutomappingConfiguration
{
    public override bool ShouldMap(Type type)
    {
        return type.Name.EndsWith("Entity");
    }
    public override bool IsVersion(FluentNHibernate.Member member)
    {
    return member.Name == "Version";
    }
}

また、このコードによってロードされるアセンブリ内のクラスがあります (アセンブリは参照されず、動的にロードされることに注意してください)。ControlEntity という名前のクラスと別のクラス:

public class ControlEntityMap : ClassMap<ControlEntity>
{
    public ControlEntityMap()
    {
        HasMany(x => x.Properties).Component(c => {
            c.Map(v => v.Culture);
            c.Map(v => v.Name);
            c.Map(v => v.Value);
        });
    }
}

問題は ControlEntityMap のコンストラクターが実行されないことです! 私がしなければならないこと?

4

1 に答える 1

0

AutoMap を使用しようとしているためです。次のようなものを使用できます。

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.Load("your assembly name")))

アップデート:

この状況では ovverride DefaultAutomappingConfiguration によって正しく行っていますが、「Entity」で終わるすべてのクラスと AutoMap から無視したいクラスも「Entity」で終わるすべてのクラスを AutoMap しようとしています。クラスを異なる名前空間に分離し、それを ShouldMap プロパティで宣言できると思います。

また、FluentNhibenate Wiki にはいくつかの情報があります。

基本型を無視するには、単純に ShouldMap(Type) メソッドから除外します。これが最もクリーンなオプションである場合があります。ただし、もう少し明確にしたい場合は、IgnoreBase メソッドを使用できます。

AutoMap.AssemblyOf() の後、基本クラスを識別できるように、自動マッパーが使用している規則を変更する必要があります。

AutoMap.AssemblyOf(cfg) .IgnoreBase();

エンティティ クラスを無視するようにオートマッパーに指示するだけの IgnoreBase 呼び出しを追加しました。この呼び出しは、必要に応じて何回でも連鎖できます。

于 2012-09-29T14:29:06.400 に答える