实体框架代码首先级联删除0..1到多个

时间:2014-11-13 11:55:30

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

我使用这种模型来实现0..1到很多关系。页面必须具有有效的书籍ID或null。

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; }
}

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

我可以(仅?)使用流畅的api执行此操作:

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

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

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

如果我注释掉了Book.Pages属性,它就有效,但我无法调用book.Pages,而是必须拨打dbcontext.Pages.Where(p => p.Book.Id == book.Id),这不是理想的,因为我不是希望调用代码必须知道dbcontext对象。

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

2 个答案:

答案 0 :(得分:0)

我认为在代码中首先你必须尝试这个

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

答案 1 :(得分:0)

这里你可以做什么

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

此代码应该可以正常使用