Как вставить фильм со списком существующих уникальных жанров (с отношением «многие-многие» EF Core)?C#

Место общения программистов C#
Ответить
Anonymous
 Как вставить фильм со списком существующих уникальных жанров (с отношением «многие-многие» EF Core)?

Сообщение Anonymous »

При попытке вставить фильм со списком уникальных жанров возникают следующие ошибки.

System.InvalidOperationException: экземпляр типа сущности ' Жанр» невозможно отследить, поскольку уже отслеживается другой экземпляр с тем же значением ключа для {'Id'}. При присоединении существующих сущностей убедитесь, что присоединен только один экземпляр сущности с заданным значением ключа. Рассмотрите возможность использования DbContextOptionsBuilder.EnableSensitiveDataLogging, чтобы просмотреть конфликтующие значения ключей.
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.1.ThrowIdentityConflict(InternalEntityEntry entry) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap1.Add(ключ TKey, запись InternalEntityEntry, логическое значение updateDuulate)
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap1.Add(TKey key, InternalEntityEntry entry) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap1.Добавить(запись InternalEntityEntry)

Вопрос
Как правильно его вставить ?
Вот мои объекты
public class Movie
{
public int Id { get; set; }
public string Title { get; set; } = null!;
public ICollection Genres { get; set; } = [];
}

[Index(nameof(Name), IsUnique = true)]
public class Genre
{
public int Id { get; set; }
public string Name { get; set; } = null!;
public ICollection Movies { get; set; } = [];
}

public class AppDbContext(DbContextOptions o) : DbContext(o)
{
public DbSet Movies { get; set; }
public DbSet Genres { get; set; }
}

И мой веб-API:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext(o => o.UseSqlite("DataSource=Movie.db"));

var app = builder.Build();
if (app.Environment.IsDevelopment())
{
using IServiceScope scope = DevelopmentSeeder(app);
}

app.MapPost("movies", async Task (AppDbContext db) =>
{
Genre[] genres =
[
new Genre{Name="comedy"},
new Genre{Name="action"},
new Genre{Name="drama"},
new Genre{Name="horror"},
];

foreach (var genre in genres)
{
var existing = await db.Genres.FirstOrDefaultAsync(g => g.Name == genre.Name);

if (existing is null)
{
db.Genres.Add(genre);
}
else
{
genre.Id = existing.Id;
}
}

var movie = new Movie
{
Title = "I don't know",
Genres = genres
};

db.Movies.Add(movie);

await db.SaveChangesAsync();
return TypedResults.Ok();
});

app.Run();

static IServiceScope DevelopmentSeeder(WebApplication app)
{
var scope = app.Services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService();
db.Database.EnsureDeleted();
db.Database.EnsureCreated();

Genre[] genres =
[
new Genre{Name="comedy"},
new Genre{Name="action"},
];

db.Genres.AddRange(genres);

Movie movie = new Movie
{
Title = "Kungfu Hustle",
Genres = genres
};
db.Movies.Add(movie);

db.SaveChanges();

return scope;
}


Подробнее здесь: https://stackoverflow.com/questions/787 ... ore-many-m
Ответить

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

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

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

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

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