.NET / Entity Framework Core / SQL Server过程返回重复值



我正在构建我的第一个.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

上面的原始问题中的评论非常有帮助。

最新更新