我使用这种模型来实现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名称?
答案 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
此代码应该可以正常使用