私はここに構造を持っています。私は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が挿入している順序であると思うようになります、それは問題です。私はそれが順番どおりになると期待しています。
- INSERT INTO人事
- 最後のキー(PersonnelId)AgencyIdとPersonnelIdと
- INSERT INTO AgencyPersonnelDisciplineを取得します。
これは制約に違反しません。
エンティティクラスはどのように見えますか? – Paco
エンティティクラスを追加しました。 – Craig