我正在构建我的第一个.NET,实体框架,&Angular Project,我与API遇到了障碍。我已经在SQL Server中创建了三个过程,这些过程完全按照我需要的方式运行。然后,我创建了一个小型API,该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外测试存储的PROC或查询时,它将正确运行。
这是您正在使用的类或模型上的[键]装饰。
很有可能是重新使用在字段级别上正确的对象,但键不是单个主键字段。您的症状将是正确的记录数量,但它与EntityFrameWorkCore一遍又一遍地重复相同的数据。
如果您需要复合多个字段键,则需要使用Fluent API。这里有一个简单的示例,用于此处的多个字段复合键…
https://learn.microsoft.com/en-us/ef/core/modeling/keys
上面的原始问题中的评论非常有帮助。