1

Web をよく検索しましたが、問題の適切な解決策が見つかりません。

基本的にはプロパティで多対多の関係を作ろうとしているのですが、タイトルの通り通常のクラスではなくインターフェースで動作するはずです。

これらは、関係にある私の 2 つのインターフェイスです。

public interface IFaq  
{  
     IList<IFaqTagReference> FaqTagReferences { get; set; }  
     ...
}

public interface ITag
{  
     IList<IFaqTagReference> FaqTagReference { get; set; }
     ...
}  

および関係を指定する 3 番目のインターフェイス

public interface IFaqTagReference  
{  
     IFaq Faq { get; set; }  
     ITag Tag { get; set; }  
}

nhibernate マッピングでは、そのように試します (通常、各要素にはプロパティがありますが、機能していない関係だけです):

var mapper = new ConventionModelMapper();  
mapper.Class<Faq>(map =>  
                  {
                     map.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
                     map.Set(x => x.FaqTagReferences,
                             db =>
                             {
                                 db.Key(km =>
                                        {
                                            km.Column("FaqId");
                                            km.NotNullable(true);
                                        });                            
                                 db.Table("FaqTagReferences");
                                 db.Cascade(Cascade.None);
                                 db.Inverse(true);
                             }, 
                             r => r.OneToMany(m => m.Class(typeof(FaqTagReference)))    
                             );
                   });

mapper.Class<Tag>(map =>
                 {   
                     map.Id(x => x.Id, m => m.Generator(Generators.GuidComb));                 
                     map.Set(x => x.FaqTagReferences,
                             db =>
                             {
                                  db.Key(km =>
                                         {
                                              km.Column("TagId");
                                              km.NotNullable(true);
                                         });
                                  db.Table("FaqTagReferences");
                                  db.Cascade(Cascade.None);
                                  db.Inverse(true);
                             }, 
                             r => r.OneToMany(m => { m.Class(typeof(FaqTagReference)); })
                             );
                 });

mapper.Class<FaqTagReference>(map =>
                         {
                            map.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
                            map.ManyToOne(x => x.Faq, db => { db.Column("FaqId"); db.Class(typeof(Faq)); });
                            map.ManyToOne(x => x.Tag, db => { db.Column("TagId"); db.Class(typeof(Tag)); });
                         });

しかし、これは次の例外をスローします

Could not determine type for:
System.Collections.Generic.IList[[Entities.IFaqTagReference,
BaseInterfaces, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]],
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, for
columns: NHibernate.Mapping.Column(FaqTagReferences)

すべてのヒントまたは解決策に感謝します

4

1 に答える 1

1

リスコフの置換原理と何か関係があるのではないかと思います

http://en.wikipedia.org/wiki/Liskov_substitution_principle

essentially type IList<IFaqTagReference> is not type IList<FaqTagReference>

Fluent NHibernate を使用してエンティティ -> インターフェイス関係をどのようにマップしますか?に似て います。

于 2012-05-09T04:38:55.403 に答える