簡體   English   中英

即使在設置datacontract之后,Entity Framework在使用臨時表調用存儲過程時仍返回null

[英]Entity Framework returns null on calling stored procedure with temp table even after setting datacontract

我有一個存儲過程,如下所示。 請參閱第1 = 2行用於設置數據上下文。 我從這里的一篇文章中閱讀了此內容。 在我的C#代碼中,我按以下方式調用此存儲過程。 我可以在數據庫中看到存儲過程的結果。 我可以在數據庫中看到2條結果記錄。

但是從下面的C#代碼調用將返回計數2,但兩個記錄的計數都為null和0。 請幫忙。

public class UnreadAlerts
{
        public string alertName { get; set; }
        public int alertValue { get; set; }
}

public List<UnreadAlerts> AllUnreadAlertsCount(int userId)
{
    List<UnreadAlerts> Sdetails = new List<UnreadAlerts>();

    using (var context1 = new AltusEntities())
    {
        Sdetails = context1.Database.SqlQuery<UnreadAlerts>("[dbo].[sp_UnreadAlertsCount] @userid",
                new SqlParameter("@userid", userId)
                ).ToList();
    }

    return Sdetails;
}

存儲過程代碼:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER Procedure [dbo].[sp_UnreadAlertsCount]  
    @userId int  
AS
BEGIN
    IF 1 = 2 
    BEGIN
        SELECT
            cast(null as nvarchar(50))  as Aname
            ,cast(null as int)    as Avalue
        WHERE
            1 = 2  
    END

    CREATE TABLE #Results  
    (  
        Aname nvarchar(50),  
        Avalue int  
    )  

    INSERT INTO #Results (Aname, Avalue)  
        SELECT
            'ProximityAlerts',
            COUNT(DISTINCT ProximityMeetingAlertID) 
        FROM
            AltusRt.dbo.ProximityMeetingAlerts pma  
        JOIN
            AltusRt.dbo.ProximityMeetings pm ON pma.ProximityMeetingID = pm.ProximityMeetingID  
        WHERE
            pm.RequestID IN (SELECT r.RequestId 
                             FROM Users u 
                             JOIN Requests r ON u.UserId = r.CreatedByUserId
                             WHERE u.UserId = @userId 
                               AND r.CreatedByUserId = @userId)  

        INSERT INTO #Results (Aname,Avalue)  
            SELECT
                'MonitorAlerts',
                COUNT(*) 
            FROM 
                dbo.TargetGeoFenceResult 
            WHERE
                ActiveStatus = 1  

        SELECT Aname, Avalue 
        FROM #Results
    END

列名稱和屬性名稱不匹配。 結果,這些值永遠不會復制到UnreadAlerts實例,並且會為您提供默認值intstring

現在,您可以通過更改屬性名稱來修復它:

public class UnreadAlerts
{
    public string Aname{ get; set; }
    public int Avalue { get; set; }
}

或者,通過使用[ColumnAttribute]作為別名:

public class UnreadAlerts
{
    [Column(Name = "Aname")]
    public string alertName { get; set; }
    [Column(Name = "Avalue")]
    public int alertValue { get; set; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM