modelBuilder.Entity<Image>()
.ToTable("Images");
modelBuilder.Entity<ImageContent>()
.HasKey(x => x.ImageId)
.ToTable("Images");
То, что вы здесь делаете, называется разбиение таблицы , то есть в базе данных есть одна таблица, Images
, которая "разбивается" на две сущности,Image
и ImageContent
.Когда вы удаляете пару сущностей, которая содержит разделенную таблицу, один из способов сделать это - удалить сущность основная , пока включена зависимая сущность.Главная сущность определяется в отображении ...
modelBuilder.Entity<Image>()
.HasRequired(x => x.Content)
.WithRequiredDependent(x => x.Image);
В которой говорится: Image
является зависимым, поэтому ImageContent
является основным.
Иесть проблема.
Строка ...
context.Set<Image>().Remove(image);
... удаляет зависимую сущность.
Теперь вы можете легко это исправитьвключив Content
, а также пометив его для удаления (пока игнорируя Variations
):
using System.Data.Entity;
...
var image = context.Set<Image>().Include(i => i.Content)
.Single(i => i.Id == id);
context.Entry(image).State = EntityState.Deleted;
context.Entry(image.Content).State = EntityState.Deleted;
Но я думаю, что модель имеет больше смысла, когда Image
является главной сущностью:
modelBuilder.Entity<Image>()
.HasRequired(x => x.Content)
.WithRequiredPrincipal(x => x.Image);
Теперь изображение может быть удалено без явного удаления Content
:
var image = context.Set<Image>().Include(i => i.Content)
.Single(i => i.Id == id);
context.Entry(image).State = EntityState.Deleted;
// or context.Set<Image>().Remove(image);
Это также упрощает удаление вариантов:
var image = context.Set<Image>()
.Include(i => i.Content)
.Include(i => i.Variations.Select(v => v.Content))
.Single(i => i.Id == id);
foreach (var variation in image.Variations)
{
context.Set<Image>().Remove(variation);
}
context.Set<Image>().Remove(image);
В качестве бонуса,это также позволяет вам сделать удаление менее дорогостоящим, только извлекая Image
s из базы данных без их (большого) содержимого и удаляя содержимое с помощью заглушки .Я покажу вам, как это сделать только для одного изображения:
var img1 = context.Set<Image>(). Single(i => i.Id == 1);
img1.Content = new ImageContent { ImageId = img1.Id }; // Stub entity
context.Entry(img1.Content).State = Entity.EntityState.Unchanged; // Attach to context
context.Set<Image>().Remove(img1);
context.SaveChanges();