2014-01-04 3 views
1

У меня есть хранимая процедура:рамки сущности и хранимая процедура

CREATE PROCEDURE SELECT_Some_Data 
    @Sreachstr nvarchar(200) 
AS 
BEGIN 
    SELECT ROW_NUMBER() OVER(ORDER BY [Document].DocNo DESC) AS Row,* 
    FROM Document WHERE [email protected] 
END 

, когда я исполню ее с @Sreachstr='153', он возвращает 15 записей.

Я использую Entity Framework, чтобы получить данные, возвращаемые хранимой процедуры:

public static List<DocumentInfo_Full_Data> SelectByDocNo(string SearchStr) 
{ 
    using (LibEntities_new db = new LibEntities_new()) 
    { 
     return SelectByDocNo(db, SearchStr); 
    } 
} 

private static List<DocumentInfo_Full_Data> SelectByDocNo(LibEntities_new db, String SearchStr) 
{ 
    return db.SelectByDocNo(SearchStr).ToList(); 
} 

public ObjectResult<DocumentInfo_Full_Data> SelectByDocNo(global::System.String searchStr) 
{ 
    ObjectParameter searchStrParameter; 
    if (searchStr != null) 
    { 
     searchStrParameter = new ObjectParameter("SearchStr", searchStr); 
    } 
    else 
    { 
     searchStrParameter = new ObjectParameter("SearchStr", typeof(global::System.String)); 
    } 

    return base.ExecuteFunction<DocumentInfo_Full_Data>("SelectByDocNo", searchStrParameter); 
} 

Когда я называю этот метод с параметром SearchStr="15", я вижу одну запись, что в 15 раз повторяется вместо 15 различных записей.

+0

Что такое ** первичный ключ **, определенный в вашей таблице «Документ» в базе данных? Какое поле определяется как ** ключ ** в вашей организации EF? –

+0

Поле по имени recno является основным в таблице документов – AComputer

+0

И это также ваш ** ключ ** в классе сущности Entity Framework? –

ответ

1

У меня это случилось со мной однажды, когда я выбирал строки из вида в EF.

Поскольку в самом представлении нет первичного ключа, EF не смог определить ключ - вместо этого EF создал «догадавшийся» ключ на основе всех столбцов, не допускающих нулевое значение, из представления.

Мое представление возвратило четыре строки данных, например.

Col1 Col2 Col3 Col4 
    1  2  'ABC' 42 
    1  2  'DEF' 57 
    1  2  'GHI' 4711 
    1  2  'JKL' 404 

-> мой запрос работал просто отлично в SQL Server Management Studio.

«Ключ», который предположил ЭФ, основывался на (Col1, Col2).

Теперь, когда я извлекла строки с помощью EF, это произошло:

  • первый ряд был выбран - EF увидел у него не было никаких данных пока, так что сохраняется эта строка в наборе результатов
  • была выбрана следующая строка - EF определил, что ключ был таким же ((1,2)), поэтому он предположил, что это была та же строка; тот же ключ -> тот же ряд, так что тот же объект был сохранен второй, третий и четвертый раз

Таким образом, в конце концов, что я вернулся из EF был

Col1 Col2 Col3 Col4 
    1  2  'ABC' 42 
    1  2  'ABC' 42 
    1  2  'ABC' 42 
    1  2  'ABC' 42 

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

Так что это может происходить в вашем случае тоже - особенно если создается новый сложный тип для данных, возвращаемых из хранимой процедуры - и если ваш ключ на EF объекта (DocumentInfo_Full_Data) не правильно установлен фактический, действительно идентифицирующий столбец (или набор столбцов) из базы данных. Проверьте это!

+1

спасибо за сообщение. Я установил Entity Key и так теперь все в порядке – AComputer

Смежные вопросы