删除嵌套集合的元素在实体框架

问题描述:

我使用实体框架存储以下实体类的对象:删除嵌套集合的元素在实体框架

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

    private ICollection<Book> _books; 
    public virtual ICollection<Book> Books => _books ?? (_books = new List<Book>()); 
} 

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

    public int LibraryId { get; set; } 
    public virtual Library Library { get; set; } 

    private ICollection<Page> _pages; 
    public virtual ICollection<Page> Pages => _pages ?? (_pages = new List<Page>()); 
} 

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

    public int BookId { get; set; } 
    public virtual Book Book { get; set; } 
} 

我希望能够去除从相应的集合个人页面和书,所以我做下面的配置与流畅的API:

modelBuilder.Entity<Library>() 
    .HasMany(library => library.Books) 
    .WithOptional() 
    .HasForeignKey(book => book.LibraryId); 
modelBuilder.Entity<Book>() 
    .HasKey(book => new { book.Id, book.LibraryId }) 
    .Property(book => book.Id) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

modelBuilder.Entity<Book>() 
    .HasMany(book => book.Pages) 
    .WithOptional() 
    .HasForeignKey(page => page.BookId); 
modelBuilder.Entity<Page>() 
    .HasKey(page => new { page.Id, page.BookId }) 
    .Property(page => page.Id) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 

创建组合键为BookPage,并成立了一个一对多的关系。

当我尝试创建一个迁移我收到以下错误:

Book_Pages_Source_Book_Pages_Target: : The number of properties in the Dependent and Principal Roles in a relationship constraint must be identical.

我怀疑的错误是对Page外键,这可能应该包括LibraryId,因为它是部分PK Book ...我应该如何修复配置?

+1

也许你的页面上的FK是错误的,因为它只引用'Book'的PK的一部分? https://*.com/a/11755058/7034621 – orhtej2

+2

这个模型有很多缺陷。首先,“身份”列已经是唯一的,所以完全不需要创建复合PK。其次,'.WithOptional()'映射都是错误的--FK是'int',因此**需要**,并且相应的导航属性也没有映射。 –

由于orhtej2指出在Page上的FK关系上面的评论中遗漏了LibraryId,因为这个值也是Book的PK的一部分。我已经不再使用流畅的API,而是使用数据注释。下面的实体类在做什么,我需要:

public class Library 
{ 
    [Key] 
    public int Id { get; set; } 

    private ICollection<Book> _books; 
    public virtual ICollection<Book> Books => _books ?? (_books = new List<Book>()); 
}  

public class Book 
{ 
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Key, Column(Order = 1), ForeignKey("Library")] 
    public int LibraryId { get; set; } 
    public virtual Library Library { get; set; } 

    private ICollection<Page> _pages; 
    public virtual ICollection<Page> Pages => _pages ?? (_pages = new List<Page>()); 
} 

public class Page 
{ 
    [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    [Key, Column(Order = 1), ForeignKey("Book")] 
    public int BookId { get; set; } 
    [Key, Column(Order = 2), ForeignKey("Book")] 
    public int LibraryId { get; set; } 
    public virtual Book Book { get; set; } 
} 

组合键在BookPage需要确保的是,当我举个例子,从Pages收集一种书的删除一个项目,不仅是PageBook之间的关系被删除,而且存储页面的记录实际上从数据库中删除(如this answer中所述)。