Как вы используете MyList.Contains (MyObject), когда NHibernate заполняет MyList прокси-элементами - PullRequest
0 голосов
/ 02 декабря 2010

У меня NHibernate отношения многие ко многим. Прежде чем добавить элемент в отношение, я хочу проверить, существует ли этот элемент в коллекции. Мой метод Add выглядит как

public virtual void AddCourse(Course course)
{
    if (!this.Courses.Contains(course))
    {
        course.Students.Add(this);
        this.Courses.Add(course);
    }
}

Оператор Courses.Contains (course) всегда терпит неудачу. Я немного покопался и понял, что список Courses - это список прокси NHibernate, а не объектов моего домена. Для здравомыслия я провел тест, который показал, что у меня настроено равенство для правильной работы. Тест также показал, что Contains не работает на подклассе.

Я отключил отложенную загрузку в коллекции Courses, и код работает нормально.

Итак, как вы делаете это с Lazy-загруженными объектами?

Ответы [ 2 ]

1 голос
/ 02 декабря 2010

Не могу проверить это прямо сейчас на моей машине, но есть несколько идей:

  1. проверка с использованием GetHashCode:

    if (!this.Courses.Any(r => r.GetHashCode() == course.GetHashCode()))
    
  2. проверить используя уникальное свойство Course.Например, Id:

    if (!this.Courses.Any(r => r.Id == course.Id))
    

Оба выражения использовали System.Linq пространство имен (не забудьте включить его раньше).ИМХО, второй пример - лучший.

0 голосов
/ 02 декабря 2010

Хмм ...

Простите мой VB, но вы пытались сделать ручную проверку элементов?то есть

For Each itemIn In me.Courses
    If itemIn Is course
        course.Students.Add(this);
        this.Courses.Add(course)
    End If
Next

Эти явные вызовы для каждого элемента в списке могут заставить элементы быть загружены должным образом.

Я думаю, что ключом здесь является то, что вам нужно сделать«Достаточно призвать элементы вашего Списка, чтобы преодолеть лень, хотя я думаю, вы это знаете.Я думаю, что это более или менее то, что пытается сделать ответ Genius, но я не совсем уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...