powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate ISet Contains... true? false? true? false? true? false?
16 сообщений из 16, страница 1 из 1
NHibernate ISet Contains... true? false? true? false? true? false?
    #36470176
Loki_KAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет. затык:

есть код типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Myobj A=new Myobj(){Name="A"};
Myobj B=new Myobj(){Name="B"};

ISet<Myobj> tmp=new HashedSet<Myobj>();

tmp.Add(A);
tmp.Add(B);

//Вот это вернет False :(
bool IsExist=tmp.Contains(A);

//Вот это найдет экземпляр
Myobj C=tmp.Where(x => x.Name== "A").Single();

//а вот это снова вернет False
bool IsExist=tmp.Contains(C);

Мозг сломался и отказывается воспринимать действительность.
Переопределял Equals, GetHashCode,
Myobj имплементирует IEqualityComparer<Myobj >,IEquatable<Myobj >

С помощью чего проверяется вхождение обьекта? эта, ммм.... редиска.., по дебагу не попадает ни в
Equals, ни в GetHashCode ни в компараторы.

Судя по msdn ICollection.Contains , при отсутствии компараторов испольдует дефолтный, который должен использовать Equals и GetHashCode. Этого не происходит.

кто-нибудь сталкивался с подобным?

сложное не нужно, нужное не сложно...
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #36470927
Loki_KAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ппц!,ппц!,ппц!,ппц!,ппц!,ппц!,ппц!

Заменил ISet на IList и все ок.

fake:
Код: plaintext
using Iesi.Collections.Generic;

боольше я Iesi не использую :(

ппц, 4-ре дня коту под хвост.


сложное не нужно, нужное не сложно...
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #36471370
SergASh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорош плакаться. Берем рефлектор в руки и убеждаемся, что 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.
  public class Myobj
  {
    public string Name { get; set; }
    public bool Equals( Myobj obj )
    {
      if ( ReferenceEquals( null, obj ) ) return false;
      if ( ReferenceEquals( this, obj ) ) return true;
      return Equals( obj.Name, Name );
    }
    public override bool Equals( object obj )
    {
      if ( ReferenceEquals( null, obj ) ) return false;
      if ( ReferenceEquals( this, obj ) ) return true;
      if ( obj.GetType() != typeof( Myobj ) ) return false;
      return Equals( (Myobj)obj );
    }
    public override int GetHashCode()
    {
      return ( Name != null ? Name.GetHashCode() : 0 );
    }
  }
  class Program
  {
    static void Main( string[] args )
    {
      Myobj A = new Myobj() { Name = "A" };
      Myobj B = new Myobj() { Name = "B" };

      ISet<Myobj> tmp = new HashedSet<Myobj>();

      tmp.Add( A );
      tmp.Add( B );

      //Вот это вернет true
      bool IsExist = tmp.Contains( A );

      //Вот это найдет экземпляр
      Myobj C = tmp.Where( x => x.Name == "A" ).Single();

      //а вот это снова вернет true
      IsExist = tmp.Contains( C );

    }
  }
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #36472166
Loki_KAV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А никто и не плакался :)

По поводу рефлектора - проверил в первую очередь, поверь. Приведенный пример сильно упрощен. Почему вылезла бага с 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 на который, до релиза, как-то не очень хочется залазить :)


сложное не нужно, нужное не сложно...
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #36472413
SergASh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну так может начать с того, чтобы привести минимальный компилируемый пример, на котором было бы видно, что что-то не работает? А то пока все выглядит голословно.
И еще вопрос: вы сами вызываете Contains или его NHibernate вызывает, и вам кажется, что вызывает неправильно? Короче говоря, пример прояснил бы ситуацию.
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #36489340
guest2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть подозрение, что дело в GetHashCode.
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #36489848
Dmitry Sukhovilin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest2Есть подозрение, что дело в GetHashCode.
В этом случае IList тоже бы не работала.
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #36490167
guest2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IList не использует GetHashCode. Эту функцию использует Dictionary (для ключей).
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #36490468
Dmitry Sukhovilin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
guest2IList не использует GetHashCode. Эту функцию использует Dictionary (для ключей).
Точно! Я не привильно написал.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
NHibernate ISet Contains... true? false? true? false? true? false?
    #37205181
aphina-dt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так, сейчас задам дурацкий вопрос, но... спросить больше не у кого. Как вы все так ловко ISet объявляете? У меня и Систем Коллекшнз Дженерик подключена и чего .Net 4... а все равно нет его в списке возможных интерфейсов для объявления и все... Все есть: ICollections с прочие, все классы... кроме SortedSet... Вот как-то так. Как жить дальше?)
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #37235271
KirillMedvedev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aphina-dt,

Iesi.Collections.dll
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #37235928
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KirillMedvedev,

ISet из .NET4 тоже можно, но с дополнительными телодвижениями.
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #37305376
NHibernate_User_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как ни странно, у меня Contains заходило по дебагу в Equals. Оно так и должно?
Даже для Iesi.
Может, ISet конфликтовал? Я когда пишу просто ISet, оно думает, что это стандартный ISet из .NET, а потому я всегда явно пишу Iesi.Collections.Generic.ISet<S> s;
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #37305380
NHibernate_User_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С другой стороны, возможно, у меня ситуация немного другая из-за того, что возвращаемое ImmutableSet<> все же преобразуется к IEnumerable. Что должно быть в этом случае?

Код: plaintext
1.
2.
3.
4.
5.
        public virtual IEnumerable<S> Ss
        {
            get { return new ImmutableSet<S>(ss); }
        }
        private Iesi.Collections.Generic.ISet<S> ss; // оно и маппится
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #37305871
SolYUtor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NHibernate_User_,

а вы в принципе понимаете разницу между маппингами set, bag и list?
...
Рейтинг: 0 / 0
NHibernate ISet Contains... true? false? true? false? true? false?
    #37306372
NHibernate_User_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
двунаправленные связи можно делать только через bag или set
bag - он не различает свои элементы ни по какому id, в нем могут быть неуникальные элементы (повторяющиеся) и отсюда каждый раз удаляет всю коллекцию и вставляет заново все элементы в новом составе. Т.о. никому не подходит. Есть еще idbag, но он не поддерживается (Fluent-ом).
set - различает элементы по id и потому обходится единственной операцией update/delete/insert. К сожалению, он-то и реализован через непонятно что, а именно чужие коллекции Iesi. Но и с ним мы справились.


а почему был такой вопрос?
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate ISet Contains... true? false? true? false? true? false?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]