2012-02-17 10 views
1

私たちは流暢なnhibernateオートマッピングを使用して多対多の関係を適用する際に問題に直面しています。コードは、上記グループと受信者は、多対多の関係があることが記載Fluent Nhibernateオートマッピングを使用する多対多リレーションシップ

public class Group 
{ 
    private readonly IList<Recipient> _recipients = new List<Recipient>(); 
    public virtual IList<Recipient> Recipients 
    { 
     get { return _recipients; } 
    } 
} 

public class Recipient 
{ 
    private readonly IList<Group> _groups = new List<Group>(); 
    public virtual IList<Group> Groups 
    { 
     get { return _ groups; } 
    } 
} 

として次のよう

ドメインモデルの簡略化した形態です。 私たちはドメインモデルをデータベースにマップするために、流暢なnhibernateの自動マッピング機能を使用しています。ですから、私たちはオートグラフ化のために条約を使う必要がありました。続き は、我々は多くの大会に多くのために使用されるコードである: -

public class ManyToManyConvention : IHasManyToManyConvention 
{ 
    #region IConvention<IManyToManyCollectionInspector,IManyToManyCollectionInstance> Members 

    public void Apply(FluentNHibernate.Conventions.Instances.IManyToManyCollectionInstance instance) 
    { 
     if (instance.OtherSide == null) 
     { 
      instance.Table(
       string.Format(
        "{0}To{1}", 
        instance.EntityType.Name + "_Id", 
        instance.ChildType.Name + "_Id")); 
     } 
     else 
     { 
      instance.Inverse(); 
     } 
     instance.Cascade.All(); 
    } 

    #endregion 
} 

私はここに、この解決策を見つけた:

http://blog.vuscode.com/malovicn/archive/2009/11/04/fluent-nhibernate-samples-auto-mapping-part-12.aspx#Many%20to%20Many%20convention

しかし、上記のコードでのRecipients->グループのためとの両方の時間をデバッグ中グループ - >受信者instance.OtherSideはnullではありません。前提は1回目のinstance.OtherSideはnullではなく、もう一方の関係が適用されるときに2度目はnullになるので、逆に適用します。 これは同じマッピングテーブルを2つ作成しています。 同じスキーマの2つのテーブルを持つのはデータベースへのロードです。たとえ私が多対多の関係を使ってデータベースにドメインモデルを保存しようとしても。それは1つだけの側面を節約します。つまり、受信者をグループに保存しますが、Recipients.Inデータベースのグループを保存しないでください。両方ともではない1つのマッピングテーブルにもエントリがあります。

ですから、問題は正しいことですか?そうでなければ、それをどうやって行うのか。

+0

あなたはFNHのバージョンを使用しないよう自分自身を逆取ることができますか? – Firo

+0

@Firo - それは1.2.0.0 – Niraj

答えて

2

あなたは基準

public void Apply(IManyToManyCollectionInstance instance) 
    { 
     Debug.Assert(instance.OtherSide != null); 
     // Hack: the cast is nessesary because the compiler tries to take the Method and not the property 
     if (((IManyToManyCollectionInspector)instance.OtherSide).Inverse) 
     { 
      instance.Table(
       string.Format(
        "{0}To{1}", 
        instance.EntityType.Name + "_Id", 
        instance.ChildType.Name + "_Id")); 
     } 
     else 
     { 
      instance.Inverse(); 
     } 
     instance.Cascade.All(); 
    } 
+0

if(instance.OtherSide == null ||((IManyToManyCollectionInspector)instance.OtherSide).Inverse) – dariol

+0

@dario-gはAssertを参照してください。 'instance.OtherSide == null'はelseにいくつかの追加の考えが必要です – Firo

関連する問題