|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
Доброго времени суток! Возникла проблема при обновлении внешнего ключа сущности Код: sql 1.
Проблема именно с Publisher_Id, его у меня нет в таблице Диаграмма базы данных Сущности Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Мэппинги Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
Небольшой тест Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
NHProfiler показывает следующее (добавляет издателя (publisher), добавляет книгу и затем пытаеться обновить publisher_id у книги Собственно, вопрос, почему Nhibernate генерирует в качестве FK Publisher_id, когда в мэппинге явно указан PublisherID ? ========================== Данный частный случай - описан здесь . И проблема решается после добавления Inverse в мэппинг коллекции. Но все же остается вопрос появления Publisher_id , как можно этого избежать? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2012, 19:49 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
Эмм, не видел перед своим носом. После добавления .KeyColumn("PublisherID"), эта ошибка исчезла, но теперь проблема с Index = 0 , который виден в изображении выше. Новый мэппинг Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
"Неправильный синтаксис около \"Index\". Если имелась в виду часть табличной подсказки, то для этого теперь необходимо использовать ключевое слово A WITH и круглые скобки. Правильный синтаксис см. в электронной документации по SQL Server." ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2012, 20:00 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
Разобрался индексация появляется из-за добавления AsList() Посоветуйте пожалуйста хороший док по NHibernate, натыкался как-то в сети, но или не сохранил закладку, либо сохранил, но не в ту папку. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2012, 20:31 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
И извиняюсь за офтопп.. как вы решаете проблему с тестированием ? К примеру, пока вы не замепите весь граф, то Nhibernate будет "ругаться". Можно не мэппить весь граф, но при условии, что тестируемая сущность отображается на таблицу, в которой FK возможны Null ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2012, 20:45 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
1. List для nhibernate не просто коллекция, а именно нумерованный список. Т.е именно для этого он сохраняет индекс, чтобы восстановить порядок следования элементов. По-умолчанию это поле называется Index, поэтому NHibernate его и пытается вставить. 2. Неправильный синтаксис около Index - тут есть подводные камни, что такое слово - ключевое для sql, чтобы не возникала ошибка - надо его брать в ковычки. .KeyColumn("`PublisherID`"), либо в конфигурации устнавливать keyword autoimport. 3. Официальный сайт NHibernate . Там же есть документация, называется Reference . 4. Проблему с тестирования я решаю так и так . ... |
|||
:
Нравится:
Не нравится:
|
|||
16.05.2012, 22:58 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
SolYUtor, спасибо за помошь! Немного дополню - может кому интересно будет, когда набредут на эту ветку с моей проблемой именования внешних ключей. Эту проблему можно решить двумя способами: 1) В каждом ClassMap указывать имя ключа, например Код: c# 1. 2. 3.
2) Использовать конвенции, подробно здесь Пример конвенции Код: c# 1. 2. 3. 4. 5. 6. 7.
А так добавить конвенцию в вам мэппинг (фрагмент) Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2012, 15:47 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
besserebrenik, не за что. Но лучше бросьте FNH, и переходите на встроенный в NH Mapping By Code. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2012, 15:56 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
а еще лучше все сразу :) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2012, 17:22 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
ViPRos, Бросить? :) У меня вопрос еще один появился, не знаю, стоит ли заводить новый топик. Может и стоит, вопрос достаточно распространенный Собственно, при вызове SaveOrUpdate ничего не происходит. К примеру, вот код Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Обновления происходят только в том случае, если раскомментировать flush или Commit(). Судя по этому материалу это вполне может быть нормальное поведение, т.к. объект Publisher принадлежит текущей сессии, и изменение будут сделаны только после flush. По сути Save или SaveOrUpdate что-то наподобие ISet.Attach в EF ? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2012, 18:56 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
Вот этому материалу (чуть повыше) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2012, 18:58 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
Небольшое дополнение, понятно что обновления лучше делать в рамках транзакции, ведь чаще мы обновляем не одну сущность, а корень агрегации и нельзя допустить чтобы часть модели обновилось/добавилась, а другая нет. Но все же хотелось бы понять этот вопрос ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2012, 19:04 |
|
Foreign Key Update Problem (NHibernate)
|
|||
---|---|---|---|
#18+
besserebrenik, будет или нет NH писать в базу при вызове методов зависит от: 1. id-generator'а сущности. native, sequence и прочие генерируемые БД заставляют NH выполнить вставку сразу. 2. FlushMode сессии. По-умолчанию OnTransactionCommit (именно поэтому сессия писала при коммите). ... |
|||
:
Нравится:
Не нравится:
|
|||
17.05.2012, 21:54 |
|
|
start [/forum/topic.php?fid=17&msg=37799568&tid=1350352]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 308ms |
total: | 469ms |
0 / 0 |