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

问题描述 投票:0回答:1

我正在构建我的第一个 .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();
        }
    }
}
c# .net sql-server entity-framework stored-procedures
1个回答
3
投票

这个问题很容易陷入。您不会收到任何明确的错误。在运行时,您会注意到同一记录有多个结果。当您在 EF 之外测试存储过程或查询时,它将正确运行。

它是你正在使用的类或模型上的[Key]装饰。

您很可能重复使用在字段级别正确的对象,但键不是单个主键字段。您的症状将是正确的记录数,但 EntityFrameworkCore 对每条记录一遍又一遍地重复相同的数据。

如果您需要复合多个字段键,则需要使用 Fluent API。 这里有一个多字段组合键的简单示例......

https://learn.microsoft.com/en-us/ef/core/modeling/keys

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

© www.soinside.com 2019 - 2024. All rights reserved.