Привет All.
Всего несколько дней как шагнул в мир NHibernate. Читал-читал доки (разные) и так не нашёл ответа на свой вопрос. Наверняка точно кто-то сталкивался. Но я что-то банально туплю либо просто ещё не мыслю в стиле hibernate.

Постараюсь вопрос объяснить кратко и лаконично. Пример: есть таблица-класс студентов и таблица-класс групп:
class Student
{
public int id;
public string name;
public Group group;
}
class Group
{
public int id;
public string name;
}
Каждый студент может быть только в одной группе, а в группе может быть куча студентов. Т.е. студенты относятся к группе как many-to-one. Ну и собсно вопрос с условиями:
— Список групп предопределён и по большому счёту статичен (либо очень редко меняется).
— Список студентов динамичен.
— Есть форма где вводится ФИО студента и из списка выбирается предопределённые группы.
Как собсно должен выглядеть маппинг/код чтобы при сохранении студента и на основании выбранной группы, NHibernate сохранял только самого студента и ссылку на уже существующую запись группы?
Буду заранее благодарен...
Здравствуйте, xander.od, Вы писали:
XO>Привет All.
XO> Всего несколько дней как шагнул в мир NHibernate. Читал-читал доки (разные) и так не нашёл ответа на свой вопрос.
Возникает вопрос, что читал, если элементарную вещь не нашел?
...
XO> Как собсно должен выглядеть маппинг/код чтобы при сохранении студента и на основании выбранной группы, NHibernate сохранял только самого студента и ссылку на уже существующую запись группы?
Смотри
5.1.10. many-to-one,
6.4. One-To-Many Associations и пробуй сделать.
Здравствуйте, achmed, Вы писали:
XO>> Всего несколько дней как шагнул в мир NHibernate. Читал-читал доки (разные) и так не нашёл ответа на свой вопрос.
A>Возникает вопрос, что читал, если элементарную вещь не нашел?
Читал и Quick Start и NHibernate мануалы про маппинг и прочее. Ну разные туториалы на разных сайтах.

как создать many-to-one маппинг мне понятно. Мне не понятен другой момент:
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
Student newStud = new Student();
newStud.name = "Vasya Pupkin";
newStud.group.name = "Group#1"
session.Save(newStud);
session.Close();
Такой код как я понимаю запишет студента и группу в таблицы. Но как мне избежать записи группы? Т.е как указать hibernate'у, что записать надо только студента, и в эту же запись студента вставить только ссылку на уже существующую в базе запись группы без создания новой? Группы должны изменяться отдельно, а не при создании записи студента. Is it possible?
A>Смотри 5.1.10. many-to-one, 6.4. One-To-Many Associations и пробуй сделать.
есессно читал уже, но так до конца не понял как свой вопрос решить
Здравствуйте, xander.od, Вы писали:
Мне не понятен другой момент:
XO>XO>ISessionFactory factory = cfg.BuildSessionFactory();
XO>ISession session = factory.OpenSession();
XO>Student newStud = new Student();
XO>newStud.name = "Vasya Pupkin";
XO>newStud.group.name = "Group#1"
XO>session.Save(newStud);
XO>session.Close();
XO>
XO> Такой код как я понимаю запишет студента и группу в таблицы. Но как мне избежать записи группы? Т.е как указать hibernate'у, что записать надо только студента, и в эту же запись студента вставить только ссылку на уже существующую в базе запись группы без создания новой? Группы должны изменяться отдельно, а не при создании записи студента. Is it possible?
Нужно загрузить существующую группу и присвоить ее в поле group
int grupIdFromUI = ....
Group group = session.Load<Group>(grupidFromUI);
Student newStud = new Student();
newStud.name = "Vasya Pupkin";
newStud.group = group;
session.Save(newStud);
session.Close();
Здравствуйте, achmed, Вы писали:
A>Нужно загрузить существующую группу и присвоить ее в поле group
A>A>int grupIdFromUI = ....
A>Group group = session.Load<Group>(grupidFromUI);
A>Student newStud = new Student();
A>newStud.name = "Vasya Pupkin";
A>newStud.group = group;
A>session.Save(newStud);
A>session.Close();
A>
до банального всё просто...

Я так понимаю, что при session.Save(newStud) если в таблице group существует запись с таким же id как и в student.group, то hibernate проверяет надо ли делать update этой группы? И если не надо, то просто устанавливает ссылку в записи student? Так получается?
Здравствуйте, xander.od, Вы писали:
XO> до банального всё просто...
Я так понимаю, что при session.Save(newStud) если в таблице group существует запись с таким же id как и в student.group, то hibernate проверяет надо ли делать update этой группы? И если не надо, то просто устанавливает ссылку в записи student? Так получается?
Не совсем, NH запоминает в контексте сессии какие обьекты загружены из БД
потому такую проверку выполнять не приходится
если в таблице group существует запись с таким же id как и в student.group