Исправить ошибку при вставке в таблицу LogsEjecucion из-за конфликта с ограничением внешнего ключа.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Исправить ошибку при вставке в таблицу LogsEjecucion из-за конфликта с ограничением внешнего ключа.

Сообщение Anonymous »

Я работаю над проектом в Visual Studio 2022 с ASP.NET Core, подключенным к SQL Server Management Studio, проект с использованием MVC и с использованием базы данных (с помощью Scaffold-Database), в основном я создаю очередь задач , это таблицы:

Код: Выделить всё

CREATE TABLE LogsEjecucion
(
LogID INT PRIMARY KEY IDENTITY(1,1),
TareaID INT NOT NULL,
EstadoID INT NOT NULL,
Mensaje NVARCHAR(MAX),
FechaLog DATETIME DEFAULT GETDATE(),

CONSTRAINT FK_LogsEjecucion_Tareas
FOREIGN KEY (TareaID) REFERENCES Tareas(TareaID),
CONSTRAINT FK_LogsEjecucion_EstadosTarea
FOREIGN KEY (EstadoID) REFERENCES EstadosTarea(EstadoID)
);

ALTER TABLE LogsEjecucion
ADD Descripcion NVARCHAR(MAX),
FechaCreacion DATETIME DEFAULT GETDATE();

CREATE TABLE EstadosTarea
(
EstadoID INT PRIMARY KEY IDENTITY(1,1),
NombreEstado NVARCHAR(50) NOT NULL UNIQUE
);
Ошибка в сети гласит:

При обработке запроса произошло необработанное исключение.
SqlException : Инструкция INSERT конфликтует с ограничением FOREIGN KEY «FK_LogsEjecucion_EstadosTarea». Конфликт возник в базе данных «ProyectoPrograDB», таблица «dbo.EstadosTarea», столбец «EstadoID».
Microsoft.Data.SqlClient.SqlConnection.OnError(исключение SqlException, boolbreakConnection, Действие WrapCloseInAction)
DbUpdateException: произошла ошибка при сохранении изменений объекта. Подробности смотрите во внутреннем исключении.
Microsoft.EntityFrameworkCore.Update.AffectedCountModificationCommandBatch.ConsumeResultSetAsync(int startCommandIndex, RelationalDataReader Reader, CancellationToken cancelToken)
Ошибка в VS:

Код: Выделить всё

SET IMPLICIT_TRANSACTIONS OFF;
SET NOCOUNT ON;

INSERT INTO [LogsExecution] ([Description], [StatusID], [CreationDate], [Message], [TaskID])
OUTPUT INSERTED.[LogID], INSERTED.[LogDate]
VALUES (@p0, @p1, @p2, @p3, @p4);
'AdvancedProgrammingProject.exe' (CoreCLR: clrhost): 'C:\Program Files\dotnet\shared\Microsoft.NETCore.App\8.0.11\System.Reflection.Metadata.dll' loaded. Symbol loading skipped. The module is optimized and the debugger option 'Just my code' is enabled.
> Microsoft.EntityFrameworkCore.Update: Error: An exception occurred in the database while saving changes for context type 'ProyectoProgramacionAvanzada.Models.ProyectoPrograDbContext'.
Microsoft.EntityFrameworkCore.DbUpdateException: An error occurred while saving the entity changes. See the inner exception for details.
>
> Microsoft.Data.SqlClient.SqlException (0x80131904): INSERT statement conflicted with FOREIGN KEY constraint 'FK_LogsEjecucion_EstadosTarea'.  The conflict has occurred in database 'ProyectoPrograDB', table 'dbo.EstadosTarea', column 'EstadoID'.
at Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
>
> at Microsoft.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
> at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at Microsoft.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows)
at Microsoft.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more)
at Microsoft.Data.SqlClient.SqlDataReader.ReadAsyncExecute(Task task, Object state)
at Microsoft.Data.SqlClient.SqlDataReader.InvokeAsyncCall[T](SqlDataReaderBaseAsyncCallContext`1 context)
ModelBuilder DbContext:

Код: Выделить всё

    modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.EstadoID).HasName("PK__EstadosT__FEF86B603D2331A8");

entity.ToTable("EstadosTarea");

entity.HasIndex(e => e.NombreEstado, "UQ__EstadosT__6CE50615135F16DF").IsUnique();

entity.Property(e => e.EstadoID).HasColumnName("EstadoID");
entity.Property(e => e.NombreEstado).HasMaxLength(50);
});

modelBuilder.Entity(entity =>
{
entity.HasKey(e => e.LogId).HasName("PK__LogsEjec__5E5499A8CC80DE29");

entity.ToTable("LogsEjecucion");

entity.Property(e => e.LogId).HasColumnName("LogID");
entity.Property(e => e.EstadoID).HasColumnName("EstadoID");
entity.Property(e => e.FechaLog)
.HasDefaultValueSql("(getdate())")
.HasColumnType("datetime");
entity.Property(e => e.TareaId).HasColumnName("TareaID");

entity.HasOne(d => d.Estado).WithMany(p => p.LogsEjecucion)
.HasForeignKey(d => d.EstadoID)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_LogsEjecucion_EstadosTarea");

entity.HasOne(d => d.Tarea).WithMany(p => p.LogsEjecucions)
.HasForeignKey(d => d.TareaId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_LogsEjecucion_Tareas");
});
Метод IActionResult Create контроллера:

Код: Выделить всё

  // GET: LogsEjecucion/Create
public IActionResult Create()
{
ViewData["EstadoID"] = new SelectList(_context.EstadosTareas, "EstadoID", "NombreEstado");
ViewData["TareaId"] = new SelectList(_context.Tareas, "TareaId", "TareaId");
return View();
}

// POST: LogsEjecucion/Create
[HttpPost]
[ValidateAntiForgeryToken]
public async Task Create([Bind("LogId,TareaId,EstadoId,Mensaje,FechaLog,Descripcion,FechaCreacion")] LogsEjecucion logsEjecucion)
{
if (!ModelState.IsValid)
{
_context.Add(logsEjecucion);
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}

ViewData["EstadoID"] = new SelectList(_context.EstadosTareas, "EstadoID", "EstadoID", logsEjecucion.EstadoID);
ViewData["TareaId"] = new SelectList(_context.Tareas, "TareaId", "TareaId", logsEjecucion.TareaId);

return View(logsEjecucion);
}
Модель LogsEjecucion:

Код: Выделить всё

using System;
using System.Collections.Generic;

namespace ProyectoProgramacionAvanzada.Models;

public  class LogsEjecucion
{
public int LogId { get; set; }
public int TareaId { get; set; }
public int EstadoID { get; set; }

public string? Mensaje { get; set; }

public DateTime? FechaLog { get; set; }

public virtual EstadosTarea Estado { get; set; } = null!;
public virtual Tarea Tarea { get; set; } = null!;

public string Descripcion { get; set; } = null!;
public DateTime FechaCreacion { get; set;  }
}
Модель EstadosTarea:

Код: Выделить всё

using System;
using System.Collections.Generic;

namespace ProyectoProgramacionAvanzada.Models;

public class EstadosTarea
{
public int EstadoID { get; set; }
public string NombreEstado { get; set; } = null!;

// Propiedad para los LogsEjecucion (asegúrate de que esto sea necesario)
public virtual ICollection LogsEjecucion { get; set; } = new List();
public virtual ICollection Tareas { get; set; } = new List();
}
Я уже проверил, что данные есть в БД, методы публикации в формах Create существуют, мне кажется, что ссылки в моделях тоже правильные, я действительно не Я не понимаю, почему у меня возникает эта ошибка, если Scaffold-Database должна генерировать модели, а Visual Studio сама создает контроллеры автоматически.

Подробнее здесь: https://stackoverflow.com/questions/792 ... e-restrict
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»