2009-05-14 17 views
1

私はここに構造を持っています。私はManyToManyToMany関係を持っています。nHibernate ManyToManyToMany with Fluent

これは私の(切り詰められた)流暢なマッピングです。

public AgencyMap() 
{ 
    Id(x => x.AgencyId, "AgencyId");    
    Map(x => x.AgencyCode, "AgencyCode"); 
    HasManyToMany<Personnel>(x => x.Personnel) 
    .WithTableName("AgencyPersonnel") 
    .WithParentKeyColumn("AgencyId") 
     .WithChildKeyColumn("PersonnelId").Cascade.All().LazyLoad(); 
} 

public PersonnelMap() 
{ 
    Id(x => x.PersonnelId, "PersonnelId");  
    HasManyToMany<Discipline>(x => x.Disciplines) 
     .WithTableName("AgencyPersonnelDiscipline") 
     .WithParentKeyColumn("AgencyPersonnelId") 
     .WithChildKeyColumn("DisciplineId") 
     .Cascade.SaveUpdate().LazyLoad(); 
}   

public DisciplineMap() 
{ 
    SchemaIs("dbo");    
    Id(x => x.DisciplineId, "DisciplineId");    
    Map(x => x.DisciplineCode, "DisciplineCode");   
    Map(x => x.Description, "Description");   
} 

私はこのようなコードを実行します。

Agency agency = m_AgencyRepository.Get(10); 
var personnel = new Personnel() { ... }; 
personnel.Disciplines.Add(new Discipline() { ... }); 
agency.Personnel.Add(personnel); 
m_AgencyRepository.Save(agency); 

このコードを実行すると、このエラーが発生します。

could not insert collection: [PPSS.Model.Personnel.Disciplines#22][SQL: SQL not available] 
The INSERT statement conflicted with the FOREIGN KEY constraint "AgencyPersonnel_AgencyPersonnelDiscipline_FK1". The conflict occurred in database "PPSS2", table "dbo.AgencyPersonnel", column 'AgencyPersonnelId'.\r\nThe statement has been terminated. 

エンティティは次のようになります。

public class Agency 
{ 
    public virtual int AgencyId {get; set;} 
    public virtual IList<Personnel> Personnel {get; set;} 
} 

public class Personnel 
{ 
    public virtual int PersonnelId {get; set;} 
    public virtual IList<Agency> Agencies {get; set;} 
    public virtual IList<Dependency> Dependencies {get; set;} 
} 

public class Dependency 
{ 
    public virtual int DependencyId {get; set;} 
    public virtual string Name {get; set;} 
} 

私はその後、担当者に多対多に逆を追加する場合は人事が保存されているではなく、専門分野は(例外が発生しません)。

このマッピングはどのように行う必要がありますか?

編集:

私はいくつかの情報を持っています。 AgencyPersonnel_AgencyPersonnelDiscipline_FK1という制約を無効にすると、すべてがOKに挿入されます。これは、それがnHibernateが挿入している順序であると思うようになります、それは問題です。私はそれが順番どおりになると期待しています。

  1. INSERT INTO人事
  2. 最後のキー(PersonnelId)AgencyIdとPersonnelIdと
  3. INSERT INTO AgencyPersonnelDisciplineを取得します。

これは制約に違反しません。

+0

エンティティクラスはどのように見えますか? – Paco

+0

エンティティクラスを追加しました。 – Craig

答えて

0

これは切り詰められたマッピングなので、私は暗闇の中で撮影するつもりです:)。 、のようなものをXとY、と私は両方の方向からそれらをマッピングします:私は2つの実体を持っているときに例外の上のこの種は、通常、私に何が起こる

XはY

YはX

のリストを持っている性質を持っています

Inverse()属性が設定されていないものがあります。両方向に何かをマッピングしているかどうか確認しますが、Inverse()を設定しないでください。

0

あなたが持っているタイプの地図が​​正しいとすれば、あなたは職員から代理店に、または規律から人員に戻されていません。