0

我使用實體框架存儲以下實體類的對象:刪除嵌套集合的元素在實體框架

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://stackoverflow.com/a/11755058/7034621 – orhtej2

+2

這個模型有很多缺陷。首先,「身份」列已經是唯一的,所以完全不需要創建複合PK。其次,'.WithOptional()'映射都是錯誤的--FK是'int',因此**需要**,並且相應的導航屬性也沒有映射。 –

回答

0

由於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中所述)。