Entity Framework 4 возвращает искаженный беспорядок, если базовые данные не отражают первичный ключ Entity - PullRequest
4 голосов
/ 31 января 2011

У нас есть хранимая процедура, в которой есть оператор выбора:

select convert(int, c.ID) as ID,
       convert(nvarchar(255), c.name) as name,
       convert(varchar(32), a.state) as state
from   customer c join address a on
       c.addressid = a.ID
where  c.name like @custNameSpec

При выполнении в окне T-SQL создаются две записи:

ID  Name    State
1   Robert  PA
2   Rob     VA

При выполнении вEntity Framework 4 в качестве функции импорта возвращает две записи, но первая запись дублируется:

ID  Name    State
1   Robert  PA
1   Robert  PA

Мы удалили функцию импорта и импортированную функцию, воссоздали ее и т. Д. Мы также добавили эти преобразования SQLПриведенные выше операторы () гарантируют, что Entity Framework понимает типы данных, возвращаемые с сервера.

Что мы можем сделать, чтобы это исправить?Что вызывает подобные дубликаты?

Наши тесты включают:

var myresult3 = myUOW.DC.GetAdDir(todaysdate: null, store_nbr: 14, 
                                  adtype: null).ToList();
var myresult4 = DB.GetAdDir(todaysdate: null, store_nbr: 14, 
                            adtype: null).ToList();

Оба возвращают одинаковый неверный результат.Профилировщик SQL показывает этот вызов:

exec [dbo].[GetCust] @todaysdate=NULL,@custNameSpec='Rob',@adtype=NULL

РЕДАКТИРОВАТЬ:

Видимо, бизнес-правила изменились.POCO, сгенерированный из Entity Framework, неправильно установил первичный ключ, поэтому он вернул правильное количество полей, но «удалил» дубликаты, сделав все дубликаты одинаковыми (на основе полей первичного ключа POCO.)

ТамMergeOption упоминался в других удаленно связанных вопросах, которые могут объяснить, почему это происходит.

1 Ответ

4 голосов
/ 17 февраля 2011

Когда вы создаете уникальное ограничение для сущности, такое как первичный ключ, и у вас есть дубликаты, поступающие из данных, Entity Framework будет повторять первую дублирующую запись для всех полей для каждого найденного дубликата.

Другими словами, Entity Framework возвращает искаженный беспорядок, если ваши базовые данные не отражают первичный ключ правильно.

...