0

編集 - 簡単な要約

かなりの量のテキストがあることに気付いたので、ここに問題の簡単な要約を示します。

  • <many-to-any />Fluent NHibernateではサポートされていません
  • プロパティ マッピングを XML と Fluent 間で分割して <many-to-any />関係をマッピングしたい
  • 名前付きクエリでこれが可能であることがわかりました
  • インターフェイスに XML と Fluent の両方を使用しようとすると、NHibernateDuplicateMappingException
  • インターフェイスに XML のみを使用し、サブクラスに Fluent を使用しようとすると、XML マップはデータベースに到達しますが、Fluent は無視されます。

大量の規則が定義されているので、このクラス階層に XML だけを使用するのは避けたいと思います。

また、Fluent で多対多を使用する代わりの解決策を誰かが知っている場合は、喜んで試してみたいと思います。


編集 - 完全な質問とコード サンプル

多対多の関係を共有する 2 つのクラス ("Foo" と "Bar" と呼びます) があります。通常、これを Fluent でマッピングするのはHasManyToMany(x => x.SomeProperty)、クラス マップに挿入するのと同じくらい簡単です。ただし、インターフェイスの 1 つで問題が発生しました。

参考までに、オブジェクトの基本的な設定例を次に示します。

public class Foo
{
    public virtual long ID { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual IList<IBar> Bars { get; set; }
}

public interface IBar
{
    long ID { get; set; }
    IList<Foo> Foos { get; set; }
}

IBar はほとんどすべてのクラスにアタッチできるインターフェイスであるため、中間テーブルで参照される「BarID」は、任意の数の他のテーブルに属することができます。これは「多対多」の関係であるため、Fluent ではまだサポートされていません(はい、これは NHibernate のmapping-by-codeでサポートされていることを知っています)。

幸いなことに、NHibernate の xml マッピングは、Fluent を使用するプロジェクトで簡単に使用できます。ただし、*.hbm.xml ファイルでマップ全体を定義するのではなく、.hbm.xml ファイルのみをマップしたいと考えています<many-to-any />。残りは、Fluent マップに保持したいと思います (基本的に、マッピングを 2 つのファイルに分割します)。

名前付きクエリやストアド プロシージャなどでこれが可能であることはわかっていますが、このパターンを使用して関係を定義するのに少し問題があります。

現在の Foo クラスの Fluent マッピングは次のとおりです。

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Id(x => x.ID);
        Map(x => x.Name);
        Map(x => x.Description);
    }
}

そして、ここに Foo.hbm.xml ファイルがあります:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyProject" namespace="MyProject.Entities">
    <class name="Foo" table="Foos"> 
        <id name="ID">      
            <generator class="identity" />
        </id>
        <bag name="Bars" table="FooBarRelationship">
            <key column="ID" />
            <many-to-any id-type="System.Int64" meta-type="System.String">
                <column name="BarID" />
                <column name="BarType" />
            </many-to-any>
        </bag>
    </class>
</hibernate-mapping>

単独では、これらは両方とも正常に機能します。たとえば、Fluent マッピングのみを使用している場合、Foo テーブルは 3 つのマップされた列で生成されます。同様に、xml のみを使用すると、NHibernate は ID を持つ Foo テーブルと FooBarRelationship テーブルを作成し、両方の ID、Foregin Keys、および BarType 列を使用します。ただし、ここに問題があります。xml と Fluent マッピングの両方を使用しようとすると、NHibernateDuplicateMappingException . さらに、インターフェイスに XML のみを使用し、サブクラスに Fluent を使用すると、Fluent マップは完全に無視されます (つまり、xml しかないかのように動作します)。

かなりの検索を行いましたが、役立つ情報を見つけることができませんでした。これを機能させるために、マップ (または構成) に対してできることはありますか?

4

2 に答える 2

0

Foo マッピング全体 (およびサブクラス) を XML ファイルに入れなければならなくなる可能性があると思います。流暢なマッピングと hbm マッピングを組み合わせることができるのは正しいと思いますが、同じエンティティの場合はそれができないと思います。これはサブクラスにも当てはまるのでしょうか? ルート クラス (またはインターフェイス) のマッピングがサブクラスとは異なる方法で定義されている場合に問題が発生しているようです。

そのインターフェイスとそのサブクラスのマッピングを流暢に実行してから、アプリを実行して構成を hbm ファイルにエクスポートすることをお勧めします。

.Mappings(m =>
{
    m.FluentMappings.ExportTo(@"C:\")
}

そこから、インターフェースとそれがサブクラスのマッピングだけに切り詰めてから、多対任意のマッピングを追加します。私はそれがクリーンなソリューションであると偽るつもりはありませんが、nHibernate マッピングの深い内部に精通しておらず、hbm ファイルからのマッピングと流暢または多弁なマッピングのようなものをどのようにマージするかを理解していません。

nHibernate の雄弁なマッピングに切り替える以外に、他に何を試すことができるかわかりません (多対多マッピングでの where 句のサポートが不足していなければ、同様に試してみたくなりました)。

于 2013-05-01T16:08:16.913 に答える