EF Core Удаление связанных сущностей в отношении «один к одному»

У меня есть отношения один к одному, настроенные на ядре ef. Когда я пытаюсь удалить объект Article, мне нужно каскадировать MediPlan, так как это отношение one to one. Когда я удаляю Article, MediaPlan не удаляется.

Вот настроил.

public class Article
{
    public int Id { get; set; }

    public int MediaPlanId { get; set; }

    public MediaPlan MediaPlan { get; set; }
}

а также

public class MediaPlan
{
    public int Id { get; set; }
    public Article Article { get; set; }
}

Контекст

modelBuilder.Entity<Article>().HasOne(x => x.MediaPlan).WithOne(x => x.Article);

Код для удаления

var article = await _db.Articles
            .Include(x=>x.MediaPlan)
            .SingleAsync(x=>x.Id == id);
_db.Articles.Remove(article);
await _db.SaveChangesAsync();

Должен ли я также устанавливать FK для объекта MediaPlan?

Благодарю вас!


person kkdeveloper7    schedule 18.06.2019    source источник
comment
Каскадное удаление удаляет дочерние элементы, то есть записи, содержащие поле FK. В этом случае статья удаляется каскадно при удалении MediaPlan. У вас не может быть и того, и другого. Если вы хотите, чтобы было наоборот, вы должны сделать MediaPlan ссылкой на Article от FK.   -  person Gert Arnold    schedule 19.06.2019


Ответы (1)


Я вижу, что ваша конфигурация One-to-One Fluent API написана неправильно, поскольку вы не указали зависимый объект. Ваша конфигурация Fluent API должна быть написана следующим образом:

modelBuilder.Entity<Article>().HasOne(a => a.MediaPlan)
                              .WithOne(mp => mp.Article)
                              .HasForeignKey<Article>(a => a.MediaPlanId)
                              .OnDelete(DeleteBehavior.Cascade);

Теперь удаление MediaPlan также удалит зависимые от него Article следующим образом:

var mediaPlanToBeDeleted = await _db.MediaPlans.FirstOrDefaultAsync(x=>x.Id == id);
_db.MediaPlans.Remove(mediaPlanToBeDeleted);
await _db.SaveChangesAsync();

Теперь, если вы хотите обратное поведение, вам нужно изменить конфигурацию Fluent API.

Примечание. Только удаление основного объекта приведет к каскадному удалению зависимого объекта. Наоборот невозможно.

person TanvirArjel    schedule 18.06.2019
comment
Спасибо. Что в этом случае было бы принципом? - person kkdeveloper7; 19.06.2019
comment
МедиаПлан является основным, а Статья зависимой. - person TanvirArjel; 19.06.2019