Классы, сгенерированные Entity Framework: два объекта одного типа всегда равны после изменений

Я пытаюсь сравнить два объекта одного типа, чтобы увидеть, были ли внесены изменения. Позвольте мне объяснить процесс:

Форма заполняется при загрузке страницы. Когда форма заполнена, я сохраняю исходные данные в переменной сеанса:

newForm = FormRegistry.GetData(userID);
Session["oldForm"] = newForm;

Когда форма сохраняется после некоторых изменений, я сравниваю два объекта, и они всегда одинаковы. Данные, хранящиеся в Session["oldForm"] идентичны объекту newForm, в котором есть изменения.

Я использую Entity Framework и сначала сгенерировал объекты, используя базу данных. Это происходит только с объектами, имеющими отношение 1-N. Этот процесс отлично работает с объектами без каких-либо отношений.

Может ли кто-нибудь сказать мне, что происходит и как решить эту проблему?


person Ricky    schedule 03.04.2013    source источник
comment
Что же это за мистические объекты? Серьезно, не помешало бы немного больше данных, чтобы проанализировать это. В зависимости от объектов и применяемой логики для их сравнения может быть множество причин.   -  person Mark    schedule 04.04.2013
comment
привет, Марк, вот класс, сгенерированный EF, и несколько более подробных примеров того, что я делаю (или пытаюсь сделать): pastebin.com/75j5xjU7 это происходит только с объектами, созданными с помощью классов, которые имеют отношение 1-n.   -  person Ricky    schedule 05.04.2013


Ответы (2)


Хорошо, думаю, я лучше понимаю, что происходит, но могу ошибаться. Сначала я думал, что вы сохраняете данные между запросами, каждый раз создавая новый объект и выполняя какое-то сравнение.

Судя по тому, что вы работаете со сравнением данных формы до и после сохранения в одном и том же запросе. В любом случае это звучит так, как будто вы фактически сохраняете ссылку на свой объект, вы фактически сравниваете один и тот же объект с самим собой.

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

Этот поток может помочь: Глубокая копия объекта C#

person Mark    schedule 04.04.2013

Пара быстрых идей - во-первых, я обнаружил, что сравнение сложных объектов с оператором == не работает слишком хорошо, следует использовать object1.Equals(object2) - а затем вам нужно реализовать (т.е. переопределить) метод Equals(), в основном перебирая свойства и сравнивая каждый.

Кроме того, нули мешают. Вам нужно проверить этот случай явно. Эта ссылка полезна MSDN: рекомендации по перегрузке Equals( )

Надеюсь это поможет.

person Ackroydd    schedule 04.04.2013
comment
у меня есть метод сравнения обоих объектов, и он хорошо работает (я использую отражение) - person Ricky; 04.04.2013