Как вставить данные в таблицу слишком много-to.many с Entity Framework? - PullRequest
2 голосов
/ 10 мая 2019

Я пытаюсь вставить запись отношения многих ко многим в API ASP.NET Core 2.1, я делаю это с почтальоном, но получаю эту ошибку:

Microsoft.EntityFrameworkCore.DbUpdateException: при обновлении записей произошла ошибка. Подробности смотрите во внутреннем исключении.

System.Data.SqlClient.SqlException: недопустимое имя столбца 'AfiliadosId'.

в System.Data.SqlClient.SqlCommand. <> C.b__122_0 (Задача 1 result)<br> at System.Threading.Tasks.ContinuationResultTaskFromResultTask 2.InnerInvoke ()
в System.Threading.ExecutionContext.RunInternal (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта)
--- Конец стека трассировки от предыдущего местоположения, где было сгенерировано исключение -

в System.Threading.Tasks.Task.ExecuteWithThreadLocal (Task & currentTaskSlot)
--- Конец стека трассировки от предыдущего местоположения, где было сгенерировано исключение -

в Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteAsync (соединение IRelationalConnection, DbCommandMethod executeMethod, параметры IReadOnlyDictionary 2 parameterValues, CancellationToken cancellationToken)<br> at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken)<br> --- End of inner exception stack trace ---<br> at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.ExecuteAsync(DbContext _, ValueTuple 2, CancellationToken cancellationToken) в Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync [TState, TResult] (состояние TState, Func 4 operation, Func 4 verifySucceeded, CancellationToken cancellationToken) в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync (IReadOnlyList 1 entriesToSave, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.DbContext.SaveChangesAsync(Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken) at WebAPI.Controllers.AfiliadosCreditosController.PostAfiliadosCreditos(AfiliadosCreditos afiliadosCreditos) in D:\pruebaEmergia\WebAPI\WebAPI\Controllers\AfiliadosCreditosController.cs:line 99 at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at System.Threading.Tasks.ValueTask 1.get_Result () в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync () в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync () в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow (контекст ActionExecutedContext) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow (контекст ResourceExecutedContext) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next (State & next, Scope & scope, Object & state, Boolean & isCompleted) в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync () в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync () в Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke (HttpContext httpContext) в Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.Invoke (контекст HttpContext) в Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke (контекст HttpContext) Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: запрос выполнен в 9999.2762ms 500 текст / html; кодировка = UTF-8

Мой код:

Сущность afiliados

//------------------------------------------------------------
using System;
using System.Collections.Generic;

namespace WebAPI.Models.data
{
    public partial class Afiliados
    {
        public byte Id { get; set; }
        public string Nombre { get; set; }
        public string Apellido { get; set; }
        public byte Cedula { get; set; }
        public string Estado { get; set; }
        public string AdminId { get; set; }
        public ApplicationUser Admin { get; set; }
        public List<AfiliadosCreditos> AfiliadosCreditos { get; set; }
    }
}

Кредиты юридических лиц

using System;
using System.Collections.Generic;

namespace WebAPI.Models.data
{
    public partial class Creditos
    {
        public byte Id { get; set; }
        public string Credito { get; set; }
        public List<AfiliadosCreditos> AfiliadosCreditos { get; set; }
    }
}

Юридическое лицо AfiliadosCreditos

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace WebAPI.Models.data
{
    public class AfiliadosCreditos
    {
        public float Taza { set; get; }
        [Key]
        public byte CreditoId { get; set; }
        public Creditos Credito { get; set; }
        [Key]
        public byte AfiliadosId { get; set; }
        public Afiliados Afiliados { get; set; }
    }
}

DbContext:

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WebAPI.Models.data;

namespace WebAPI.Models
{
    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions options) : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<AfiliadosCreditos>().HasKey(x 
                            => new { x.CreditoId, x.AfiliadosId });
            modelBuilder.Entity<AfiliadosCreditos>()
                         .HasOne(x => x.Afiliados)
                         .WithMany(x => x.AfiliadosCreditos)
                         .HasForeignKey(x => x.AfiliadosId);
            modelBuilder.Entity<AfiliadosCreditos>()
                           .HasOne(x => x.Credito)
                           .WithMany(x => x.AfiliadosCreditos)
                           .HasForeignKey(x => x.CreditoId);

            base.OnModelCreating(modelBuilder);
        }

        public DbSet<ApplicationUser> ApplicationUsers { get; set; }
        public DbSet<Afiliados> Afiliados { get; set; }
        public DbSet<Creditos> Creditos { get; set; }
        public DbSet<AfiliadosCreditos> AfiliadosCreditos { get; set; }
    }
}

Контроллер

public async Task<IActionResult> PostAfiliadosCreditos([FromBody] AfiliadosCreditos afiliadosCreditos)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    _context.AfiliadosCreditos.Add(afiliadosCreditos);

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateException)
    {
        if (AfiliadosCreditosExists(afiliadosCreditos.CreditoId))
        {
            return new StatusCodeResult(StatusCodes.Status409Conflict);
        }
        else
        {
            throw;
        }
    }

    return CreatedAtAction("GetAfiliadosCreditos", new { id = afiliadosCreditos.CreditoId }, afiliadosCreditos);
}

Я хочу вставить один регистр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...