Как удалить объект, на который ссылается другой объект в EF Code First? - PullRequest
1 голос
/ 03 ноября 2011

Спокойной ночи. У меня следующая проблема в отношениях. У меня есть картинка класса Imagem

public class Imagem : Entity
{
    public long Id {get ; set;}

    public string Name{ get; set; }
}

Я строю своего рода галерею, где у меня есть изображение на лицевой стороне gallery.

public class gallery: Entity
{
    public long Id {get ; set;}

    public Imagem Frontsheet{ get; set; }
}

Моя самая большая проблема - когда я удаляю изображение, оно не уходит, потому что изображение связано с галереей.

Как вы относитесь к этому типу ситуации, чтобы удалить изображение из таблицы изображений?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2011

Я не уверен, какие именно у вас отношения между сущностями, но похоже, что это отношения 1: 1. Вам необходимо настроить отношения для каскадного удаления:

modelBuilder.Entity<gallery>().HasOptional(g => g.Image).WithRequired().WillCascadeOnDelete();

Сделайте это в конфигурации для ваших сущностей в вашем контексте:

public class SomeContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<gallery>().HasOptional(g => g.Image).WithRequired().WillCascadeOnDelete();
    }
}

Это предполагает наличие необязательных / обязательных отношений. Вы также можете сделать обязательный / обязательный. Также предполагается, что у вас нет свойства навигации от изображения к галерее.

Если вы опубликуете полный код для ваших двух моделей, вам будет намного легче помочь.

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

0 голосов
/ 03 ноября 2011

У вас есть ограничение в базе данных, которое запрещает удалять изображение, если какая-либо галерея ссылается на него через свойство FrontSheet.Что вам нужно сделать, это установить эти отношения на NULL.(Соотношение кажется необязательным, поэтому вы можете установить внешний ключ в базе данных на NULL.) В вашей модели вам нужно будет выбрать все галереи, которые ссылаются на изображение, которое вы просто хотите удалить.Это выглядело бы так, если бы вы хотели удалить изображение с Id = givenImageId:

using (var context = new MyDbContext())
{
    var imageToDelete = context.Images.Single(i => i.Id == givenImageId);
    var galleries = context.Galleries.Include("Frontsheet")
        .Where(g => g.Frontsheet.Id == givenImageId)
        .ToList();

    foreach(var gallery in galleries)
        gallery.Frontsheet = null;

    context.Images.Remove(imageToDelete);

    context.SaveChanges();
}

Если бы у вас было свойство внешнего ключа для вашего Gallery объекта ...

public long? FrontsheetId { get; set; }

... вам не нужно загружать таблицы вместе с галереями, что улучшит производительность:

using (var context = new MyDbContext())
{
    var imageToDelete = context.Images.Single(i => i.Id == givenImageId);
    var galleries = context.Galleries  // no Include anymore required
        .Where(g => g.FrontsheetId == givenImageId)
        .ToList();

    foreach(var gallery in galleries)
        gallery.FrontsheetId = null;

    context.Images.Remove(imageToDelete);

    context.SaveChanges();
}
...