Anwenden von Daten in den Tabellen [Filme], [GenreMovie] und [Genres] in einem effizienten Ansatz (hohe Leistung).
Problem:
Wenn Sie die Daten, die bereits in der Datenbank vorhanden sind, mithilfe der ID wiederverwenden müssen, aber diese Fehlermeldung erhalten
"
{"Die Instanz des Entitätstyps „Genre“ kann nicht verfolgt werden, weil Eine andere Instanz mit demselben Schlüsselwert für {'GenreId'} wird bereits verfolgt. Stellen Sie beim Anhängen vorhandener Entitäten sicher, dass nur eine Entitätsinstanz mit einem bestimmten Schlüsselwert angehängt wird. Erwägen Sie die Verwendung von „DbContextOptionsBuilder.EnableSensitiveDataLogging“, um die widersprüchlichen Schlüsselwerte anzuzeigen, die im Code „_schoolContext.AddRange(“
vorkommen
Code: Select all
else
{
var comedy = new Genre() { GenreId = genreAsDictionary["Comedy"] };
var action = new Genre() { GenreId = genreAsDictionary["Action"] };
// Bug here
_schoolContext.AddRange(
new Movie() { Name = "Test test", GenresGenres = new List() { comedy, action } });
_schoolContext.SaveChanges();
}
Wie soll ich diese Situation lösen?
Vielen Dank!
Quellcode: https://www.learnentityframeworkcore5.c ... lationship
Code: Select all
using Microsoft.AspNetCore.Mvc;
using WebApplicationStudent.Database;
namespace WebApplicationStudent.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly ILogger _logger;
private readonly SchoolContext _schoolContext;
private readonly Repo _repo;
public WeatherForecastController(ILogger logger, SchoolContext schoolContext, Repo repo)
{
_logger = logger;
_schoolContext = schoolContext;
_repo = repo;
}
[HttpGet(Name = "AddData")]
public async Task Get()
{
try
{
//_schoolContext.Database.EnsureCreated();
var genreAsDictionary = await _repo.GetGenre();
var movieAsDictionary = await _repo.GetMovie();
if (!genreAsDictionary.Any() && !movieAsDictionary.Any())
{
var comedy = new Genre() { GenreName = "Comedy" };
var action = new Genre() { GenreName = "Action" };
var horror = new Genre() { GenreName = "Horror" };
var scifi = new Genre() { GenreName = "Sci-fi" };
_schoolContext.AddRange(
new Movie() { Name = "Avengers", GenresGenres = new List() { action, scifi } },
new Movie() { Name = "Ants", GenresGenres = new List() { action, scifi } },
new Movie() { Name = "Satanic Panic", GenresGenres = new List() { comedy, horror } });
_schoolContext.SaveChanges();
}
else
{
var comedy = new Genre() { GenreId = genreAsDictionary["Comedy"] };
var action = new Genre() { GenreId = genreAsDictionary["Action"] };
// Bug here
_schoolContext.AddRange(
new Movie() { Name = "Test test", GenresGenres = new List() { comedy, action } });
_schoolContext.SaveChanges();
}
}
catch (Exception ex)
{
int ff = 23;
}
return 1;
}
}
}
Code: Select all
using Microsoft.EntityFrameworkCore;
using WebApplicationStudent.Controllers;
using WebApplicationStudent.Database;
namespace WebApplicationStudent
{
public class Repo
{
private readonly ILogger _logger;
private readonly SchoolContext _schoolContext;
public Repo(ILogger logger, SchoolContext schoolContext)
{
_logger = logger;
_schoolContext = schoolContext;
}
public async Task GetGenre()
{
return await _schoolContext.Genres.ToDictionaryAsync(a => a.GenreName ?? "", a => a.GenreId);
}
public async Task GetMovie()
{
return await _schoolContext.Movies.ToDictionaryAsync(a => a.Name ?? "", a => a.MovieId);
}
}
}
Code: Select all
Scaffold-DbContext "Server=DESKTOP-TCK\MSSQLSERVER2022;Database=Testtest2;Integrated Security=true;Trusted_Connection=True;MultipleActiveResultSets=true;TrustServerCertificate=true;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "Database" -ContextDir "Database" -DataAnnotations -Context SchoolContext -NoOnConfiguring -WarningAction:SilentlyContinue -Force -Project WebApplicationStudent -StartupProject WebApplicationStudent -schema dbo
Code: Select all
CREATE TABLE [dbo].[Movies] (
[MovieId] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Movies] PRIMARY KEY CLUSTERED ([MovieId] ASC)
);
CREATE TABLE [dbo].[Genres] (
[GenreId] INT IDENTITY (1, 1) NOT NULL,
[GenreName] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_Genres] PRIMARY KEY CLUSTERED ([GenreId] ASC)
);
CREATE TABLE [dbo].[GenreMovie] (
[GenresGenreId] INT NOT NULL,
[MoviesMovieId] INT NOT NULL,
CONSTRAINT [PK_GenreMovie] PRIMARY KEY CLUSTERED ([GenresGenreId] ASC, [MoviesMovieId] ASC),
CONSTRAINT [FK_GenreMovie_Genres_GenresGenreId] FOREIGN KEY ([GenresGenreId]) REFERENCES [dbo].[Genres] ([GenreId]) ON DELETE CASCADE,
CONSTRAINT [FK_GenreMovie_Movies_MoviesMovieId] FOREIGN KEY ([MoviesMovieId]) REFERENCES [dbo].[Movies] ([MovieId]) ON DELETE CASCADE
);
Code: Select all
using Microsoft.EntityFrameworkCore;
using WebApplicationStudent;
using WebApplicationStudent.Database;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddTransient();
builder.Services.AddDbContext(options =>
options.UseSqlServer("Server=DESKTOP-TCK\\MSSQLSERVER2022;Database=Testtest2;Trusted_Connection=True;TrustServerCertificate=True;MultipleActiveResultSets=true;"));
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Mobile version