У меня есть структура здесь, у меня есть отношение 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. Я ожидаю, что это будет сделано по порядку.
- ВСТАВИТЬ В Персонал
- Получить последний ключ (PersonnelId)
- INSERT INTO AgencyPersonnelDiscipline с AgencyId и PersonnelId.
Это не будет нарушать никаких ограничений.