編集 - 簡単な要約
かなりの量のテキストがあることに気付いたので、ここに問題の簡単な要約を示します。
<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 しかないかのように動作します)。
かなりの検索を行いましたが、役立つ情報を見つけることができませんでした。これを機能させるために、マップ (または構成) に対してできることはありますか?