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)
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可以正常工作为您的帖子提供链接。我设置了实体键,所以现在一切都好了