0

엔티티 프레임 워크에 중첩 된 컬렉션의 요소를 삭제 : I는 해당 컬렉션의 개별 페이지와 책을 제거 할 수 있도록하려면나는 다음과 같은 엔티티 클래스의 개체를 저장하는 엔티티 프레임 워크를 사용하고

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.

가의 일부이기 때문에 나는 오류가 아마 LibraryId을 포함해야 Page의 외래 키에 의심 Book PK ... 구성을 어떻게 수정해야합니까?

+1

아마 당신의 FK가'Book'의 PK의 일부만을 참조하기 때문에 잘못된 것일까 요? https://stackoverflow.com/a/11755058/7034621 – orhtej2

+2

이 모델에는 많은 결함이 있습니다. 첫째, 'Identity' 열은 이미 고유하므로 복합 PK를 만들 필요가 전혀 없습니다. 둘째,'.WithOptional()'매핑은 모두 잘못되었습니다 - FK는'int'이므로 ** 필수 **입니다. 또한 해당 네비게이션 속성도 매핑되지 않습니다. –

답변

0

orhtej2가 Page의 FK 관계가 LibraryId에 누락 되었기 때문에 orhtej2가이 값도 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에서 설명).

관련 문제