簡體   English   中英

EF Core 使用空引用執行存儲過程

[英]EF Core executing stored procedure with null reference

使用 EF Core 2.0 執行存儲過程會產生此錯誤。 這個錯誤讓我很不自在。 任何指針?

public class SalesDTO :  BaseEntity
{
    public int SalesID { get; set; }
    [Display(Name = "User")]
    public string SalesRep { get; set; }
    [Display(Name = "Sales Date")]
    public DateTime OrderDate { get; set; }
    public string CustomerName { get; set; }
    public int? CustomerID { get; set; }
    [Display(Name = "Sale Center")]
    public string CenterName { get; set; }
    public int CenterID { get; set; }
    public decimal TotalAmount { get; set; }
    public SalesType SalesType { get; set; }
}

存儲過程的模型類。

這是我的實現類

public IEnumerable<SalesDTO> GetSales(int centerID, string user)
{
        string salesRep = user ?? "";

        List<SqlParameter> parms = new List<SqlParameter>
        {
            new SqlParameter("@CenterID", centerID),
            new SqlParameter("@SalesRep", salesRep)
        };

        return DataContext.Set<SalesDTO>().FromSql("spSalesList @CenterID, @SalesRep", parms.ToArray())
                 .Select(x => new SalesDTO
                 {
                     Id = x.SalesID,
                     SalesID = x.SalesID,
                     CustomerID = x.CustomerID,
                     CustomerName = x.CustomerName,
                     SalesType = x.SalesType,
                     TotalAmount = x.TotalAmount,
                     SalesRep = x.SalesRep,
                     CenterName = x.CenterName,
                     OrderDate = x.OrderDate,
                     CenterID = x.CenterID
                 }).AsNoTracking().ToList();
    }

此代碼拋出:

NullReferenceException:未將對象引用設置為對象的實例。

使用此堆棧跟蹤

堆棧跟蹤

但是,如果我使用 SQL Server Profiler,當我將執行的內容復制回 SQL Server Management Studio 並執行它時,我可以看到存儲過程成功執行。

你能試試下面的代碼嗎?

return DataContext.Set<SalesDTO>().FromSql($"EXECUTE spSalesList {centerID} {salesRep}")
             .Select(x => new SalesDTO
             {
                 Id = x.SalesID,
                 SalesID = x.SalesID,
                 CustomerID = x.CustomerID,
                 CustomerName = x.CustomerName,
                 SalesType = x.SalesType,
                 TotalAmount = x.TotalAmount,
                 SalesRep = x.SalesRep,
                 CenterName = x.CenterName,
                 OrderDate = x.OrderDate,
                 CenterID = x.CenterID
             }).AsNoTracking().ToList();

同時,了解這些限制是值得的: https : //docs.microsoft.com/en-us/ef/core/querying/raw-sql#limitations

我剛剛意識到存儲庫工作正常,這只是數據解析。

如果您使用 .Select 中的一個屬性來匹配 2 個不同的屬性,則會生成 NULL 引用錯誤。 所以這

return DataContext.Set<SalesDTO>().FromSql("spSalesList @CenterID, @SalesRep, @DateFrom, @DateTo", parms.ToArray())
                 .Select(x => new SalesDTO
                 {
                     Id = x.SalesID,
                     SalesID = x.SalesID,
                     CustomerID = x.CustomerID,
                     CustomerName = x.CustomerName,
                     SalesType = x.SalesType,
                     TotalAmount = x.TotalAmount,
                     SalesRep = x.SalesRep,
                     CenterName = x.CenterName,
                     OrderDate = x.OrderDate,
                     CenterID = x.CenterID
                 }).AsNoTracking().ToList();

將給出空引用錯誤,因為 SalesID 與 SalesID 列和 Id 列都匹配,盡管它可能是相同的字段。 但是,當您將代碼更改為

return DataContext.Set<SalesDTO>().FromSql("spSalesList @CenterID, @SalesRep, @DateFrom, @DateTo", parms.ToArray())
                 .Select(x => new SalesDTO
                 {
                     Id = x.Id,
                     SalesID = x.SalesID,
                     CustomerID = x.CustomerID,
                     CustomerName = x.CustomerName,
                     SalesType = x.SalesType,
                     TotalAmount = x.TotalAmount,
                     SalesRep = x.SalesRep,
                     CenterName = x.CenterName,
                     OrderDate = x.OrderDate,
                     CenterID = x.CenterID
                 }).AsNoTracking().ToList();

然后它可以正常工作,因為 Id 和 SalesID 匹配不同的字段。 我還不明白為什么會這樣。 當我理解時,我會添加評論。

暫無
暫無

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

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