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

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

Код: 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
15.02.2010, 19:30
    #36470927
Loki_KAV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
ппц!,ппц!,ппц!,ппц!,ппц!,ппц!,ппц!

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

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

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

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


сложное не нужно, нужное не сложно...
...
Рейтинг: 0 / 0
16.02.2010, 00:27
    #36471370
SergASh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
Хорош плакаться. Берем рефлектор в руки и убеждаемся, что 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
16.02.2010, 12:28
    #36472166
Loki_KAV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
А никто и не плакался :)

По поводу рефлектора - проверил в первую очередь, поверь. Приведенный пример сильно упрощен. Почему вылезла бага с 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
16.02.2010, 13:45
    #36472413
SergASh
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
Ну так может начать с того, чтобы привести минимальный компилируемый пример, на котором было бы видно, что что-то не работает? А то пока все выглядит голословно.
И еще вопрос: вы сами вызываете Contains или его NHibernate вызывает, и вам кажется, что вызывает неправильно? Короче говоря, пример прояснил бы ситуацию.
...
Рейтинг: 0 / 0
26.02.2010, 09:11
    #36489340
guest2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
Есть подозрение, что дело в GetHashCode.
...
Рейтинг: 0 / 0
26.02.2010, 12:25
    #36489848
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
guest2Есть подозрение, что дело в GetHashCode.
В этом случае IList тоже бы не работала.
...
Рейтинг: 0 / 0
26.02.2010, 14:14
    #36490167
guest2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
IList не использует GetHashCode. Эту функцию использует Dictionary (для ключей).
...
Рейтинг: 0 / 0
26.02.2010, 16:01
    #36490468
Dmitry Sukhovilin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
guest2IList не использует GetHashCode. Эту функцию использует Dictionary (для ключей).
Точно! Я не привильно написал.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
07.04.2011, 16:52
    #37205181
aphina-dt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
Так, сейчас задам дурацкий вопрос, но... спросить больше не у кого. Как вы все так ловко ISet объявляете? У меня и Систем Коллекшнз Дженерик подключена и чего .Net 4... а все равно нет его в списке возможных интерфейсов для объявления и все... Все есть: ICollections с прочие, все классы... кроме SortedSet... Вот как-то так. Как жить дальше?)
...
Рейтинг: 0 / 0
27.04.2011, 10:40
    #37235271
KirillMedvedev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
aphina-dt,

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

ISet из .NET4 тоже можно, но с дополнительными телодвижениями.
...
Рейтинг: 0 / 0
11.06.2011, 17:32
    #37305376
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
Как ни странно, у меня Contains заходило по дебагу в Equals. Оно так и должно?
Даже для Iesi.
Может, ISet конфликтовал? Я когда пишу просто ISet, оно думает, что это стандартный ISet из .NET, а потому я всегда явно пишу Iesi.Collections.Generic.ISet<S> s;
...
Рейтинг: 0 / 0
11.06.2011, 17:35
    #37305380
NHibernate_User_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
С другой стороны, возможно, у меня ситуация немного другая из-за того, что возвращаемое 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
12.06.2011, 17:31
    #37305871
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate ISet Contains... true? false? true? false? true? false?
NHibernate_User_,

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


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


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