C# 实体框架和存储过程

C# 实体框架和存储过程,c#,sql-server,entity-framework,stored-procedures,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条记录 我使用实体框架获取存储过程返回

我有一个存储过程:

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条记录

我使用实体框架获取存储过程返回的数据:

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);
}
公共静态列表SelectByDocNo(字符串搜索str)
{
使用(LibEntities\u new db=new LibEntities\u new())
{
返回SelectByDocNo(db,SearchStr);
}
}
私有静态列表SelectByDocNo(LibEntities\u新数据库,字符串搜索str)
{
返回db.SelectByDocNo(SearchStr.ToList();
}
public ObjectResult SelectByDocNo(全局::System.String searchStr)
{
ObjectParameter搜索strparameter;
if(searchStr!=null)
{
searchStrParameter=新对象参数(“SearchStr”,SearchStr);
}
其他的
{
searchStrParameter=newObjectParameter(“SearchStr”,typeof(global::System.String));
}
返回base.ExecuteFunction(“SelectByDocNo”,searchStrParameter);
}

当我使用参数
SearchStr=“15”
调用此方法时,我看到一条记录重复了15次,而不是15条不同的记录

当我在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中运行良好

EF猜测的“密钥”是基于
(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\u Full\u data
)上的键未正确设置为数据库中实际的、真正标识的列(或列集)。看看

数据库中
文档
表上定义的主键是什么?哪个字段被定义为EF实体中的键?在文档表中,名为recno的字段是主要字段,这也是实体框架实体类中的键吗?您得到15个结果的事实正好表明显示结果的代码可能有错误。SQL工作是否直接针对DB运行?SqlProfiler是否显示正在运行的预期SQL?这将消除SQL本身作为问题的根源,并消除EF执行的错误SQL作为问题的根源。在SQL server management studio中,sp可以正常工作为您的帖子提供链接。我设置了实体键,所以现在一切都好了