nHibernate ManyToManyToMany с свободно - PullRequest
1 голос
/ 14 мая 2009

У меня здесь есть структура. У меня есть отношение 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 вставляет информацию. То, что я ожидал бы это сделать по порядку.

  1. INSERT INTO Personnel
  2. Получить последний ключ (PersonnelId)
  3. INSERT INTO АгентствоПерсональная дисциплина с идентификатором агентства и персоналом.

Это не нарушит никаких ограничений.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2010

Учитывая, что у вас есть карты, соответствующие типам, которые вы указали, вы не сопоставили данные от персонала к агентству или от дисциплины к персоналу.

0 голосов
/ 20 мая 2009

Так как это укороченное отображение, я собираюсь сделать снимок в темноте :). Такое исключение обычно происходит со мной, когда у меня есть 2 объекта: X и Y, и я сопоставляю их с обоих направлений, что-то вроде:

X имеет свойство Y

Y имеет список X

И ни у одного из них не установлен атрибут Inverse (). Убедитесь, что вы отображаете что-то в обоих направлениях, но не устанавливаете одно на них. Inverse ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...