|
WCF+NHibernate
|
|||
---|---|---|---|
#18+
Есть WCF сервис, в котором доступ к БД реализован с помощью NHibernate. Сервис возвращает список сотрудников. Каждый сотрудник имеет номер, имя, фамилию, дату рождения и семейное положение (тянется из словаря). Код службы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext 1. 2. 3.
Классы NHibernate объектов: Код: plaintext 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.
Мапинги: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
При выполнеии вылетает сообщение об ошибке: "Type 'Castle.Proxies.FamilyStatusProxy' with data contract name 'FamilyStatusProxy:http://schemas.datacontract.org/2004/07/Castle.Proxies' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer." Добавление атрибута KnownTypeAttribute не помогло: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Подскажите, пожалуйста, как исправить ошибку? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2011, 17:11 |
|
WCF+NHibernate
|
|||
---|---|---|---|
#18+
Balda_1, Судя по всему, Вы нарвались на типичную проблему работы связки WCF + NHibernate. У вас используется Lazy Loading, а значит связанные данные вытягиваются не в виде объявленногов вами класса (FamilyStatus - кстати, объявлять его как KnownType нет никакого смысла - этот тип и так явно используется в объявлении типа PersonalInfo), а в виде автоматически сгенерированного Castle.Proxies.FamilyStatusProxy, о котором WCF ничего не знает. Что можно сделать? Если я еще окончательно не забюыл NH, то возможны следующие варианты: не использовать lazy loading - все объяекты будут загружаться явно. Но в случае сложного графа (с большим количеством связей) вы получите страшную картину отказаться от передачи связанных свойств - загружать связанные колекции явно (именно к такому варианту подталкивает WCF Data Service, хотя и там есть expand) использовать суррогаты данных. Там суть в том, что прежде чем произвести сериализацию данных, WCF будет вызывать ваш код для инспекции графа объектов, причем этот инспектор может на ходу заменять части графа. В вашем варианте это будет означать, что вы можете вместо proxy явно достать нужный объект из базы (или коллекцию) и вернуть сериализатору уже реальные объекты. В качестве примера посмотрите вот эту статью WCF serialization with NHibernate object graphs . Особенно внимательно прочитайте комментарии - статья писалась для NH 2.0, если не ошибаюсь, а в 3.0 многое менялость (особенно в свете того, что у них тепереь используется заменяемый движок для proxy). Ну и самый радикальный способ - перейти на использование EF, для которого отдельно делалась поддержка WCF, но там будет куча своих проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2011, 10:12 |
|
WCF+NHibernate
|
|||
---|---|---|---|
#18+
Пробую реализовать суррогаты данных: Код: plaintext 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. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
Откуда взялось несоответствие типов и как это поправить? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2011, 12:56 |
|
WCF+NHibernate
|
|||
---|---|---|---|
#18+
Balda_1Откуда взялось несоответствие типов и как это поправить? Я давно не работал с сурогатами, но подозреваю, что WCF не нравится тип, который вы ему возвращаете в GetDataContractType. Посмотрите под отладкой - что там происходит ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2011, 16:20 |
|
WCF+NHibernate
|
|||
---|---|---|---|
#18+
Там просто возвращается полученный тип данных: Код: plaintext 1. 2. 3. 4.
Может ошибка из-за того, что описания классов находятся в другом проекте, а не в проекте WCF? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.07.2011, 17:12 |
|
WCF+NHibernate
|
|||
---|---|---|---|
#18+
Balda_1Может ошибка из-за того, что описания классов находятся в другом проекте, а не в проекте WCF? Врятли. Он же их нормально находит. К сожалению нет сейчас возможности воспроизвести ваш пример и посмотреть. А по памяти - уже не всплывает ничего. Попробуйте сделать следующее: 1. Посмотреть под отладкой как работает GetObjectToSerialize - не исключено, что не верно работает материализация объекта (кстати, еще такой момент - на сколько я помню для загрузки коллекций использовались какие-то отдельные методы. Это когда дойдет дело до загрузки Employees). 2. Включить трассирование на сервере и посмотреть где конкретно происходит падение - может это и не связано с сурогатом. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2011, 08:59 |
|
|
start [/forum/topic.php?fid=19&fpage=20&tid=1397410]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
78ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 192ms |
0 / 0 |