День добрый всем.
Имею сущность Person.
Имею сущность Program.
У каждого Person может быть несколько Program и у каждой Program может быть несколько Person.
Есть сущность PersonProgram.
C помощью Fluent NHibernate создаю классы так:
// Person
public class Person : Entity
{
public virtual Int32 Id { get; set; }
public virtual IList<PersonProgram> Programs { get; set; }
...
}
public class PersonMap : ClassMap<Person>
{
Table("Person");
Id(p => p.Id).Column("Id");
HasMany(p => p.Programs).KeyColumn("personID").Inverse();
...
}
// Program
public class Program : Entity
{
public virtual Int32 Id { get; set; }
...
}
public class ProgramMap : ClassMap<Program>
{
Table("Program");
Id(p => p.Id).Column("Id");
...
}
// PersonProgram
public class PersonProgram : Entity
{
public virtual Person person { get; set; }
public virtual Program Program { get; set; }
...
}
public class PersonProgramMap : ClassMap<PersonProgram >
{
Table("PersonProgram");
CompositeId()
.KeyReference(p => p.Person, "personID")
.KeyReference(p => p.Program, "programID");
...
}
Данные получаю, все отлично с этим.
При создании новой экземпляра PersonProgram и сохранении в базу вылезает ошибка.
var newPersonProgram = new PersonProgram();
newPersonProgram.Person = existedPerson;
newPersonProgram.Program = existedProgram;
...
using (ITransaction transaction = _session.BeginTransaction())
{
_session.SaveOrUpdate(newPersonProgram); // -- ошибка, что countRow = 2, ожидается 1
//_session.Save(newPersonProgram); -- ошибка, что countRow = 2, ожидается 1
//_session.Merge(newPersonProgram); -- ошибка, что поле personID не может быть заполнено значением NULL
transaction.Commit();
}
На Commit выскакивают исключения те, что привел в комментариях к каждой функции сохранения.
Что я неправильно делаю?
Я так понимаю, что NHibernate пытается сгенерировать id, хотя он уже есть в соответствующих записях, осталось их только вставить. Как быть?