删除嵌套集合的元素在实体框架
问题描述:
我使用实体框架存储以下实体类的对象:删除嵌套集合的元素在实体框架
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);
创建组合键为Book
和Page
,并成立了一个一对多的关系。
当我尝试创建一个迁移我收到以下错误:
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
...我应该如何修复配置?
答
由于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; }
}
组合键在Book
和Page
需要确保的是,当我举个例子,从Pages
收集一种书的删除一个项目,不仅是Page
和Book
之间的关系被删除,而且存储页面的记录实际上从数据库中删除(如this answer中所述)。
也许你的页面上的FK是错误的,因为它只引用'Book'的PK的一部分? https://*.com/a/11755058/7034621 – orhtej2
这个模型有很多缺陷。首先,“身份”列已经是唯一的,所以完全不需要创建复合PK。其次,'.WithOptional()'映射都是错误的--FK是'int',因此**需要**,并且相应的导航属性也没有映射。 –