【问题标题】:Entity framework code first cascading deletes on 0..1 to many实体框架代码首先级联删除 0..1 到许多
【发布时间】:2014-11-13 20:28:26
【问题描述】:

我将这种模型用于 0..1 对多的关系。页面必须具有有效的图书 ID 或为空。

public class Book
{
    [Key]
    public Guid Id { get; set; }

    public virtual List<Page> Pages { get; set; }
}

public class Page
{
    [Key]
    public Guid Id { get; set; }

    public virtual Book Book { get; set; }
}

我想添加级联删除,这样如果一本书被删除,那么它的所有页面也会被删除,而不是设置为 null。

我可以(仅?)使用 fluent api 做到这一点:

modelBuilder.Entity<Page>()
    .HasOptional(a => a.Book)
    .WithOptionalDependent()
    .WillCascadeOnDelete(true);

不适合使用[Required],因为该字段不是必需的。

但是,这会在数据库中创建另一列 Book_Id1、索引和外键,而不是在现有 FK 上添加级联删除,因为它被定义了两次。

如果我注释掉 Book.Pages 属性,它可以工作,但我失去了调用 book.Pages 的能力,而不得不调用 dbcontext.Pages.Where(p =&gt; p.Book.Id == book.Id),这并不理想,因为我不希望调用代码有了解 dbcontext 对象。

有没有办法同时拥有Book.Pages 属性和级联删除?也许将两者都设置为使用相同的 FK 名称?

【问题讨论】:

    标签: c# entity-framework ef-code-first entity-framework-6


    【解决方案1】:

    你可以做什么

    public class Book
    {
        [Key]
        public Guid Id { get; set; }
    
        public virtual List<Page> Pages { get; set; }
    }
    
    public class Page
    {
        [Key]
        public Guid Id { get; set; }
        public Guid BookId { get; set;}
    
        //[ForeignKey("BookId")] you can add the fluent here or during entity builder
        public virtual Book Book { get; set; }
    }
    
    
    modelBuilder.Entity<Page>()
        .HasOptional(a => a.Book)
        .WithMany(a=>a.Pages)
        .HasForeignKey(a=>a.BookId)
        .WillCascadeOnDelete(true);
    
    var pages= dbcontext.Pages.Where(p => p.BookId == book.Id); // this will work
    

    这段代码应该可以正常工作

    【讨论】:

    • Page.BookId 需要是可为空的 Guid 吗?以避免多重错误。请更改此内容,我会将其标记为答案。
    【解决方案2】:

    我认为在 codefirst 中你必须尝试一下

    dbcontext.Page.RemoveRange(book.Pages);
    dbcontext.Book.Remove(book);
    dbContext.SaveChanges(); 
    

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多