Мне кажется, у вас есть первичный ключ с пробой. Аспект LINQ-to-SQL и EF «управление идентификацией» означает, что он обязан возвращать один и тот же экземпляр всякий раз, когда он видит одинаковые значения первичного ключа для одного и того же типа объекта.
Например, с учетом данных:
id | name | ...
-------+------------+------
1 | Fred | ...
2 | Barney | ...
1 | Wilma | ...
1 | Betty | ...
Затем , если он думает, что id
является первичным ключом при переборе объектов из LINQ, заставляет выдавать вам "Fred", "Barney", "Fred "," Фред ". По сути, когда он снова видит id
1, он даже не смотрит на другие столбцы - он просто выбирает экземпляр с id
1 из кэша идентификаторов - и дает вам тот же экземпляр Fred, который он дал вам ранее. Если он не думает, что id
является первичным ключом, он будет обрабатывать каждую строку как отдельный объект (и что, если он имеет то же значение в одном из полей, что и другая запись - это не не совсем необычно).
Я бы посоветовал проверить, что все поля, отмеченные вами как первичный ключ (в вашей модели DBML / EDM), действительно уникальны для каждой строки. В приведенном выше случае столбец id
явно не представляет уникальный идентификатор, поэтому не подходит в качестве первичного ключа. Просто снимите отметку как таковую в конструкторе LINQ-to-SQL / EF.
update: в частности, посмотрите на свойство «Entity Key» для различных свойств в конструкторе - особенно если вы запрашиваете представление. Убедитесь, что для «Entity Key» установлено значение true только для подходящих столбцов (то есть тех, которые делают строку уникальной). Если он установлен неправильно, установите для него значение false. Это также видно в виде значка желтой клавиши - это должно появляться только на вещах, которые действительно являются уникальными идентификаторами записи.