我正在构建我的第一个 .NET、实体框架和 Angular 项目,但我的 API 遇到了障碍。我在 SQL Server 中创建了三个过程,它们完全按照我需要的方式运行。然后我创建了一个小型 API 来运行这三个过程并返回结果。
奇怪的是,API 的结果是过程返回的记录数量重复的第一行。换句话说,如果该过程返回 20 条唯一记录,则 API 将返回第一条记录 20 次。
这是我的 API 控制器:
using System;
using System.Collections.Generic;
//using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using MyApp.Models;
using MyApp.Persistence;
using Microsoft.EntityFrameworkCore;
using System.Data.SqlClient;
//using System.Data;
using AutoMapper;
namespace MyApp.Controllers
{
public class CustomerController : Controller
{
private readonly MyDbContext context;
private readonly IMapper mapper;
public CustomerController(MyDbContext context, IMapper mapper)
{
this.context = context;
this.mapper = mapper;
}
// ex: /api/Customer/GetCustomerDetails/0000000632/
[HttpGet("/api/Customer/GetCustomerDetails/{customerNumber}")]
public async Task<IEnumerable<CustomerDetail>> GetCustomerDetails(string customerNumber)
{
var custNum = new SqlParameter("@custNum", customerNumber);
return await context.CustomerDetails.FromSql("sp_MyApp_GetCustomerDetails @custNum", custNum).ToArrayAsync();
}
// ex: /api/Customer/GetCustomerTransactions/0000000632/2013-01-01T00:00:00.0000000/2017-09-26T23:59:59.0000000/
[HttpGet("/api/Customer/GetCustomerTransactions/{customerNumber}/{startDate}/{endDate}")]
public async Task<IEnumerable<CustomerTransaction>> GetCustomerTransactions(string customerNumber, DateTime startDate, DateTime endDate)
{
var custNum = new SqlParameter("@custNum", customerNumber);
var dateFrom = new SqlParameter("@dateFrom", startDate);
var dateTo = new SqlParameter("@dateTo", endDate);
return await context.CustomerTransactions.FromSql("sp_MyApp_GetCustomerTransactions @custNum, @dateFrom, @dateTo", custNum, dateFrom, dateTo).ToArrayAsync();
}
// ex: /api/Customer/GetCustomerTransactionDetails/0000000632/340084/12531/
[HttpGet("/api/Customer/GetCustomerTransactionDetails/{customerNumber}/{storeNumber}/{transactionNumber}")]
public async Task<IEnumerable<CustomerTransactionDetail>> GetCustomerTransactionDetails(string customerNumber, string storeNumber, string transactionNumber)
{
var custNum = new SqlParameter("@custNum", customerNumber);
var storeNum = new SqlParameter("@storeNum", storeNumber);
var transNum = new SqlParameter("@transNum", transactionNumber);
return await context.TransactionDetails.FromSql("sp_MyApp_GetCustomerTransactionDetails @custNum, @storeNum, @transNum", custNum, storeNum, transNum).ToArrayAsync();
}
public IActionResult Index()
{
return View();
}
}
}
这个问题很容易陷入。您不会收到任何明确的错误。在运行时,您会注意到同一记录有多个结果。当您在 EF 之外测试存储过程或查询时,它将正确运行。
它是你正在使用的类或模型上的[Key]装饰。
您很可能重复使用在字段级别正确的对象,但键不是单个主键字段。您的症状将是正确的记录数,但 EntityFrameworkCore 对每条记录一遍又一遍地重复相同的数据。
如果您需要复合多个字段键,则需要使用 Fluent API。 这里有一个多字段组合键的简单示例......
https://learn.microsoft.com/en-us/ef/core/modeling/keys
原始问题中的上述评论非常有帮助。