NHibernate и many-to-one вопрос
От: xander.od  
Дата: 25.01.08 16:01
Оценка:
Привет 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 сохранял только самого студента и ссылку на уже существующую запись группы?

Буду заранее благодарен...
Re: NHibernate и many-to-one вопрос
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 25.01.08 19:37
Оценка:
Здравствуйте, xander.od, Вы писали:

XO>Привет All.


XO> Всего несколько дней как шагнул в мир NHibernate. Читал-читал доки (разные) и так не нашёл ответа на свой вопрос.

Возникает вопрос, что читал, если элементарную вещь не нашел?

...
XO> Как собсно должен выглядеть маппинг/код чтобы при сохранении студента и на основании выбранной группы, NHibernate сохранял только самого студента и ссылку на уже существующую запись группы?

Смотри 5.1.10. many-to-one, 6.4. One-To-Many Associations и пробуй сделать.
Re[2]: NHibernate и many-to-one вопрос
От: xander.od  
Дата: 26.01.08 08:05
Оценка:
Здравствуйте, 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 и пробуй сделать.


есессно читал уже, но так до конца не понял как свой вопрос решить
Re[3]: NHibernate и many-to-one вопрос
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 26.01.08 13:12
Оценка:
Здравствуйте, 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();
Re[4]: NHibernate и many-to-one вопрос
От: xander.od  
Дата: 26.01.08 14:16
Оценка:
Здравствуйте, 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? Так получается?
Re[5]: NHibernate и many-to-one вопрос
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 27.01.08 06:17
Оценка:
Здравствуйте, xander.od, Вы писали:

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


Не совсем, NH запоминает в контексте сессии какие обьекты загружены из БД
потому такую проверку выполнять не приходится

если в таблице group существует запись с таким же id как и в student.group

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.