Добавляйте данные для многих ко многим, повторно используя одни и те же данные из таблицы.C#

Место общения программистов C#
Ответить
Anonymous
 Добавляйте данные для многих ко многим, повторно используя одни и те же данные из таблицы.

Сообщение Anonymous »

Цель: применить данные в таблицах [Movies], [GenreMovie] и [Genres] эффективным подходом (высокая производительность).
Проблема: когда вам нужно повторно использовать данные, которые уже существуют в базе данных, с помощью Id, но вы получаете эту ошибку:

Экземпляр типа сущности «Жанр» невозможно отследить, поскольку уже отслеживается другой экземпляр с тем же значением ключа для {'GenreId'}. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы увидеть конфликтующие значения ключей.

Из этого фрагмента кода
_schoolContext.AddRange("

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();
}

Мне не нужен еще один дубликат тех же данных, которые уже существуют в базе данных.
Как мне решить эту ситуацию?
Спасибо!
Исходный код: https://www.learnentityframeworkcore5.c ... lationship
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;
}
}
}


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);
}
}
}


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


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
);


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();


Подробнее здесь: https://stackoverflow.com/questions/798 ... from-table
Ответить

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

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

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

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

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