[英]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.