2014-10-08 51 views
2

不知道問題出在哪裏......我有一個存儲過程寫入(當在SQL Server管理器中執行時)返回我期望的結果看到:SQL Server存儲過程返回正確的行數,但所有的行都是相同的

USE [DataViewer] 
GO 
/****** Object: StoredProcedure [dbo].[DV_GetPSCTreeNodes] Script Date: 08/10/2014 1:48:03 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 


-- ============================================= 
-- Author:  <Me!> 
-- Description: <Used by data viewer GUI.> 
-- ============================================= 
ALTER PROCEDURE [dbo].[DV_GetPSCTreeNodes] 
    -- Add the parameters for the stored procedure here 

    @iNodeLevel int, 
    @iParentNodeId bigint 

AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sQuery varchar (2000) 

    IF @iNodeLevel >= 5 

    RETURN 

    ELSE 

    -- Insert statements for procedure here 
    SET @sQuery = 'SELECT * FROM DataView.dbo.v_Tree 
    WHERE L' + CAST((@iNodeLevel + 1) AS VARCHAR(10)) + 'ID IS NULL 
    AND L' + CAST((@iNodeLevel) AS VARCHAR(10)) + 'ID = ' + CAST((@iParentNodeId) 
    AS VARCHAR(10)) 

    EXEC (@sQuery) 
END 

如上所述,如果我在SMSS中運行此,我會得到預期的結果。但是,如果我通過已設置的服務運行這個服務,我會得到正確數量的記錄,但它們都是第一行的重複項(我可以查看錶並知道我正在重複)。如果我嘗試新的參數並在SSMS中獲得15個不同的行,我的網頁將顯示15行重複的第1行數據。

這裏是我的客戶呼叫:

List<v_PowerSystemCIMTree> list = null; 
DVServiceClient proxy = new DVServiceClient(); 

try 
{ 
    list = proxy.DV_GetPSCTreeNodes(2,325550).ToList(); //2 and 325550 are just hardcoded to 
                 //check to see if it's working 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.GetType().FullName); 
    Console.WriteLine(ex.Message); 
} 
finally 
{ 
    proxy.Close(); 
} 
return View(list); 

其中要求我的服務:

readonly DataViewerEntities _Context = new DataViewerEntities(); 

public List<DataViewer_DAL.v_PowerSystemCIMTree> DV_GetPSCTreeNodes(int firstParam, 
long secondParam) 
{ 
    return _Context.DV_GetPSCTreeNodes(firstParam,secondParam).ToList(); 
} 

見鬼,爲什麼我會得到一個結果在Management Studio中設置,但在重複數據我網頁?

+0

已知問題:由於您從**視圖**中選擇了一個沒有定義的**主鍵**,實體框架將使用所有不可爲空的列作爲「實體鍵」。如果它從具有*相同實體鍵*的視圖中讀取第二行,它將只重複已讀的第一行 - 它將**不會**查看其他剩餘的列...... – 2014-10-08 20:35:39

回答

3

已知的問題:因爲你是從視圖選擇不具有已定義的主鍵,實體框架將使用所有非空列的「實體鍵」。

如果EF讀取從視圖中第二行具有相同的實體鍵(同在所有非空列值),則只會重複第一行已經閱讀 - 它將看看其他,剩餘的列......

因此,您只需將基礎表的主鍵添加到視圖的列,將EF數據模型顯式調整爲定義一個「實體鍵」該視圖,或者您需要添加一個仿真的,唯一的列(如ROW_NUMBER())到您的視圖中,並確保它是不可空的,因此是EF「派生」實體鍵的一部分

+1

非常感謝許多!毫無疑問,你明天在工作上節省了我的時間。 – mrwienerdog 2014-10-09 00:13:06

相關問題