У меня здесь есть структура. У меня есть отношение ManyToManyToMany.
Это мои (усеченные) беглые отображения.
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;}
}
Если я добавлю инверсию к ManyToMany в персонале, то персонал будет сохранен, но не дисциплины (без исключений).
Как сделать это отображение?
Редактировать:
У меня есть еще информация. Если я отключу ограничение AgencyPersonnel_AgencyPersonnelDiscipline_FK1, то все будет вставлено нормально. Это заставляет меня думать, что проблема заключается в том, что nHibernate вставляет информацию. То, что я ожидал бы это сделать по порядку.
- INSERT INTO Personnel
- Получить последний ключ (PersonnelId)
- INSERT INTO АгентствоПерсональная дисциплина с идентификатором агентства и персоналом.
Это не нарушит никаких ограничений.