EF核心一对一删除相关实体

时间:2019-06-18 21:24:37

标签: entity-framework ef-code-first ef-core-2.1 ef-code-first-mapping

我在ef core上建立了一对一的关系。当我尝试删除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();

我也必须在MediaPlan实体上设置FK吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我看到您的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 配置。

注:仅删除主体实体将级联删除从属实体。反之亦然。