Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate? Собственно, коллекции для отображения двусторонних связей (как написано в NHibernate CookBook) могут быть либо Set, либо Bag. Bag для нас не годится, т.к. делает лишние Insert и Delete при любом изменении коллекции. Set для нас не годится, т.к. для его использования нужна сторонняя библиотека Iesi.Collections, т.о. сборка, в которой у нас лежат Entities, становится зависимой от NHibernate, использует его библиотеки. Как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2011, 20:14 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
NHibernate_User_, set, bag и list - не просто какие-то коллекции, они несут еще и логический смысл. Без iesi.collection обойтись можно, но с дополнительными телодвижениями. Рецепт . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2011, 21:13 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
С другой стороны, пример использования обычно выглядит так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. C другой, непонятно, из какого неймспейса брать ISet? Есть в стандартных коллекциях .NET ISet, и я, честно говоря, сначала думал, что имели в виду его. Потом в других источниках писали про Iesi.Collections.ISet. Но оказалось, что он не использует параметры. Потом я нашел Iesi.Collections.Generic.ISet. Может быть, надо его? Далее, предположим, в коде самой Entity надо принять IEnumerable<OrderItem> и этими значениями заполнить коллекцию HashedSet. Можно ли это сделать одной строчкой, не прибегая к foreach? Вроде есть конструктор public HashedSet(ICollection<T> initialValues); и ICollection вроде как стандартная .NET? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2011, 21:21 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
NHibernate_User_, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Для добавления одной строчкой в интерфейсе Iesi.Collection.Generic.Iset есть метод AddAll. Или сами напишите метод расширения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2011, 21:49 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Спасибо, будем пробовать. Странно, вчера такая строчка не работала: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2011, 12:02 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Со строчкой разобрались, туда передавалась Ordered Enumerable, которая не умеет конвертироваться в интерфейс ICollection, хотя грустно, конечно, что если мы хотим принимать и Ordered, то одной строчкой не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2011, 14:32 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
NHibernate_User_Спасибо, будем пробовать. Странно, вчера такая строчка не работала: Код: plaintext Опять хотите обмануть хибер, подменив ему коллекцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2011, 15:05 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Просто так часто делают в Шарпе. А что, надо сначала коллекцию очистить, а потом писать туда элементы? Код: plaintext 1. 2. Теперь проблема стоит в том, что другие entity напрямую пишут в коллекцию данного entity. По-хорошему, реализацию бы сделать protected internal. Выкрутились тремя (!) полями: одним для паблика (отдает рид-онли коллекцию), другой для entity (отдает не рид-онли коллекцию), и третий для NH. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Без protected internal скрытое поле не видят другие entity, затем без virtual и {get;set;} на него ругается NH, а потом все равно не может его найти, я уж пробовал и ReadOnlyPropertyThroughCamelCaseField, не вышло. маппинг: Код: plaintext 1. 2. 3. 4. 5. Как-то надо избавиться от трех полей... Очень прошу помочь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2011, 19:48 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
NHibernate_User_Просто так часто делают в Шарпе. А что, надо сначала коллекцию очистить, а потом писать туда элементы? Код: plaintext 1. 2. Да. коллекцию иницилизируете только в конструкторе, и больше никогда и нигде не переписывайте это поле. NHibernate_User_Теперь проблема стоит в том, что другие entity напрямую пишут в коллекцию данного entity. По-хорошему, реализацию бы сделать protected internal. Выкрутились тремя (!) полями: одним для паблика (отдает рид-онли коллекцию), другой для entity (отдает не рид-онли коллекцию), и третий для NH. Мысль в корне неправильная. Доступ к коллекции надо инкапсулировать, дабы никто не менял состояние класса. Это даже не проблема хибера, а проблема дизайна. Если желаете себе добра - не давайте менять коллекцию напрямую. Не так трудно написать два метода AddStorage/RemoveStorage. Буквы экономит? NHibernate_User_Заставить NH обратиться к свойству AccountOrganizations на чтение, а к свойству (не полю!) accountOrganizations на запись (тогда в нем стояло просто { get; set; }) я не смог. :( Без protected internal скрытое поле не видят другие entity, затем без virtual и {get;set;} на него ругается NH, а потом все равно не может его найти, я уж пробовал и ReadOnlyPropertyThroughCamelCaseField, не вышло. маппинг: Код: plaintext 1. 2. 3. 4. 5. Как-то надо избавиться от трех полей... Очень прошу помочь! Пусть хибер работает напрямую с полем. Ваша стратегия именования называется camelcase.underscore. Не знаю, есть ли такое во флюенте. В общем бест-практис для хибера должен выглдять так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2011, 22:35 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Беда в том, что у нас связь М:М и, следовательно, есть 2 коллекции, которые нужно синхронно обновлять. Т.е. при вызове метода X.DeleteY(y) надо убрать элемент из коллекции x.Y и Y.x, и при вызове метода Y.DeleteX(x) тоже. Если сделать не через коллекцию, то произойдет зацикливание. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Мы вроде смотрели во всех блогах, ресурсах по DDD - все делают именно так. Однако как это сделать с NH, похоже, непонятно :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2011, 11:04 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Короче говоря, если у Вас в проектах были связи Many-To-Many, то как Вы решали проблему с удалением связи из Entity? Как выглядели методы и как выглядели маппинги? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2011, 12:22 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Можно ведь нагородить огород с Add и Delete, но тогда придется 4 метода удаления делать, а не 2, как сейчас и как хотелось бы: а) в объекте Y метод удаляет X из Y (из обоих коллекций в обоих объектах); он удаляет X из "своей" коллекции, а потом вызывает б) в объекте X метод чисто для удаления объекта Y из X, не трогая парную коллекцию. Этот второй метод не должен вызываться ниоткуда, кроме как из первого - для удаления же извне надо вызывать первый метод или третий. Третий - соответственно в объекте X удаляет Y "полностью". Вызывает четвертый, который "не полностью" удаляет только объект X из объекта Y и не трогает "парную" коллекцию. Но так же нелепо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2011, 13:12 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
В принципе, попытался замапить скрытое поле, но Fluent его не видит. Пришлось выходить из положения через Reveal.Member<> (это само по себе не идеально), но тоже не до конца работает. Почему-то поле переименовывает в маппинге в Pascal style, если найдет такое (!) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Короче говоря, Fluent почему-то пытается вставить первую большую букву. Видит - два поля в классе: BigBangs и bigBangs, так почему-то ставит то, которое с большой (и public). Но если их развести, т.е. назвать по-разному, скажем, BigBangs и bigBangsM, то Reveal.Member<BigEntity>("bigBangsM")) работает как часы и ривилит именно bigBangsM. Как с этим бороться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2011, 18:18 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
В принципе, нашел пару методов: тут (а тут описано, как смешать конфигурацию маппингов - fluent с auto). Но решили просто переименовать одну из коллекций и не заморачиваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2011, 19:47 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Встает вопрос, не будут ли слишком большие затраты при вызове new ImmutableSet()? Мы очень обеспокоены этим... Нет ли более быстрого способа сделать коллекцию readonly? Как работает new ImmutableSet? Много ли он выполняет операций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2011, 20:35 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
NHibernate_User_, Сколько букав набежало за время моего отпуска... Давайте по порядку: Если у вас есть двунаправленные связи - поддерживайте согласованность связи только с одной стороны. Это лишит вас необходимости писать кучу дублирующих методов. Что касается FH - мне не нравится его способ маппить объекты, и не использую. Поэтому как мапить конкретное поведение с его помощь - это к гуглу. По поводу производительности ImmutableSet - не страдайте фигней. Затраты на него пренебрежимо малы по сравнению например с операциями ввода-вывода. Хотите узнать, что действительно тормозит - берите профайлер кода, и вперёд. И рекомендую прочитать про оптимизацию . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2011, 12:15 |
|
||
|
Можно ли избавиться от Iesi.Collections, нужных для Set в NHibernate?
|
|||
|---|---|---|---|
|
#18+
Спасибо, еще если кто ответит на соседнюю тему про Null у прокси , буду очень рад :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2011, 09:53 |
|
||
|
|

start [/forum/topic.php?fid=17&fpage=44&tid=1350761]: |
0ms |
get settings: |
7ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
35ms |
get topic data: |
16ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 228ms |
| total: | 386ms |

| 0 / 0 |
