实体框架和存储过程

时间:2014-01-04 08:47:23

标签: c# sql-server entity-framework stored-procedures

我有一个存储过程:

CREATE PROCEDURE SELECT_Some_Data
    @Sreachstr nvarchar(200)
AS
 BEGIN
    SELECT ROW_NUMBER() OVER(ORDER BY [Document].DocNo DESC) AS Row,*
    FROM Document WHERE DocNo=@Sreachstr 
 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条不同的记录。

1 个答案:

答案 0 :(得分:1)

当我从EF视图中选择行时,我曾经遇到过这种情况。

由于视图本身没有主键,因此EF无法确定键 - 而是EF根据视图中所有不可为空的列创建了“猜测”键。

我的视图返回了四行数据,例如

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

- &GT;我的查询在SQL Server Management Studio中工作很好

EF猜测的“关键”基于(Col1, Col2)

现在,当我使用EF检索行时,会发生这种情况:

  • 第一行被选中 - EF看到它还没有任何数据,所以它将该行存储在结果集中
  • 选择了下一行 - EF确定是相同的((1,2)再次),因此它假设这又是同一行;相同的密钥 - &gt;同一行,以便同一实体存储第二,第三和第四次

所以最后,我从EF那里得到的是

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

因为确定EF中实体唯一性的对于数据库中的四列中的每一列都是相同的。

因此,在您的情况下也可能发生这种情况 - 特别是如果您为存储过程返回的数据创建了新的复杂类型 - 以及EF实体上的({{1未正确设置为数据库中实际的,真正标识的列(或列集)。看看吧!