@Barabasishe

Как вставить новую запись в таблицу с составным ключом с помощью fluent nhibernate?

День добрый всем.

Имею сущность 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, хотя он уже есть в соответствующих записях, осталось их только вставить. Как быть?
  • Вопрос задан
  • 2527 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы