|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
Привет. затык: есть код типа: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Мозг сломался и отказывается воспринимать действительность. Переопределял Equals, GetHashCode, Myobj имплементирует IEqualityComparer<Myobj >,IEquatable<Myobj > С помощью чего проверяется вхождение обьекта? эта, ммм.... редиска.., по дебагу не попадает ни в Equals, ни в GetHashCode ни в компараторы. Судя по msdn ICollection.Contains , при отсутствии компараторов испольдует дефолтный, который должен использовать Equals и GetHashCode. Этого не происходит. кто-нибудь сталкивался с подобным? сложное не нужно, нужное не сложно... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2010, 15:32 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
ппц!,ппц!,ппц!,ппц!,ппц!,ппц!,ппц! Заменил ISet на IList и все ок. fake: Код: plaintext
боольше я Iesi не использую :( ппц, 4-ре дня коту под хвост. сложное не нужно, нужное не сложно... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2010, 19:30 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
Хорош плакаться. Берем рефлектор в руки и убеждаемся, что HashedSet<> реализован на основе стандартного Dictionary<,>. При этом HashedSet<>.Contains() прямо вызывает Dictionary<,>.ContainsKey(). Следовательно, все работает не хуже, чем в System.Collections.Generic Видимо, неправильно реализован был Equals. Надо было привести полный код MyObj. Вот так все отлично вставляет и находит. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2010, 00:27 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
А никто и не плакался :) По поводу рефлектора - проверил в первую очередь, поверь. Приведенный пример сильно упрощен. Почему вылезла бага с Iesi непонятно. Но факт налицо: HashedSet-т не заходит в Equals при вызове Contains. Поведение System.Collections.Generic такое, как и ожидалось. Не так странно что он не находит, сколько то, что в моем случае, при вызове методов HashedSet-та Contains, Remove не происходит вызов Equals и GetHashCode() обьекта- соответственно влиять на его работу я не могу:( P.S. если были неверно организованы сущности домена обьясни вот что: при замене HashedSet на любой тип из System.Collections... все начинает работать. Соответственно без модификации сущностей варьировал : 1. <Set> - ISet - HashedSet - не работает. 2. <Set> - IСollection - Collection - работает. 3. <bag> - IList - List - работает 4. <map> - IDictionary - Dictionary - работает Понятно, что изначально предполагалась уникальность обьектов в коллекции, т.к. заполняется она из System.Collections.Generic.HashSet Вообщем сиуация довольно сильно напрягает, т.к. в домене дофига замаплено на Iesi а замена ISet-а на родной будет возможна только с FW 4.0 на который, до релиза, как-то не очень хочется залазить :) сложное не нужно, нужное не сложно... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2010, 12:28 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
Ну так может начать с того, чтобы привести минимальный компилируемый пример, на котором было бы видно, что что-то не работает? А то пока все выглядит голословно. И еще вопрос: вы сами вызываете Contains или его NHibernate вызывает, и вам кажется, что вызывает неправильно? Короче говоря, пример прояснил бы ситуацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2010, 13:45 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
Есть подозрение, что дело в GetHashCode. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2010, 09:11 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
guest2Есть подозрение, что дело в GetHashCode. В этом случае IList тоже бы не работала. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2010, 12:25 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
IList не использует GetHashCode. Эту функцию использует Dictionary (для ключей). ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2010, 14:14 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
guest2IList не использует GetHashCode. Эту функцию использует Dictionary (для ключей). Точно! Я не привильно написал. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.02.2010, 16:01 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
Так, сейчас задам дурацкий вопрос, но... спросить больше не у кого. Как вы все так ловко ISet объявляете? У меня и Систем Коллекшнз Дженерик подключена и чего .Net 4... а все равно нет его в списке возможных интерфейсов для объявления и все... Все есть: ICollections с прочие, все классы... кроме SortedSet... Вот как-то так. Как жить дальше?) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.04.2011, 16:52 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
aphina-dt, Iesi.Collections.dll ... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 10:40 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.04.2011, 14:30 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
Как ни странно, у меня Contains заходило по дебагу в Equals. Оно так и должно? Даже для Iesi. Может, ISet конфликтовал? Я когда пишу просто ISet, оно думает, что это стандартный ISet из .NET, а потому я всегда явно пишу Iesi.Collections.Generic.ISet<S> s; ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2011, 17:32 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
С другой стороны, возможно, у меня ситуация немного другая из-за того, что возвращаемое ImmutableSet<> все же преобразуется к IEnumerable. Что должно быть в этом случае? Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2011, 17:35 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
NHibernate_User_, а вы в принципе понимаете разницу между маппингами set, bag и list? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2011, 17:31 |
|
NHibernate ISet Contains... true? false? true? false? true? false?
|
|||
---|---|---|---|
#18+
двунаправленные связи можно делать только через bag или set bag - он не различает свои элементы ни по какому id, в нем могут быть неуникальные элементы (повторяющиеся) и отсюда каждый раз удаляет всю коллекцию и вставляет заново все элементы в новом составе. Т.о. никому не подходит. Есть еще idbag, но он не поддерживается (Fluent-ом). set - различает элементы по id и потому обходится единственной операцией update/delete/insert. К сожалению, он-то и реализован через непонятно что, а именно чужие коллекции Iesi. Но и с ним мы справились. а почему был такой вопрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2011, 12:52 |
|
|
start [/forum/topic.php?fid=17&fpage=44&tid=1350740]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 306ms |
total: | 452ms |
0 / 0 |