嵌套实体框架CORE模型以创建树结构

时间:2019-07-16 09:38:13

标签: entity-framework-core

我在MVC中使用Entity Framework CORE,它具有三个模型
-书
-流派
-供应商

通过它们之间的链接表来管理它们之间的多对多关系
-BookGenre
-GenreSupplier

模型看起来像这样

public class BookModel{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BookID { get; set; }
    public string BookTitle { get; set; }
    public virtual ICollection<BookGenreModel> objBookGenre { get; set; }
}

public class BookGenreModel{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BookGenreID { get; set; }
    [ForeignKey("BookID")]
    public int BookID { get; set; }
    public virtual BookModel objBook { get; set; }
    [ForeignKey("GenreID")]
    public int GenreID { get; set; }
    public virtual GenreModel objGenre { get; set; }
}
public class GenreModel{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int GenreID { get; set; }
    public string GenreTitle { get; set; }
    public virtual ICollection<BookGenreModel> objBookGenre { get; set; }
}
public class GenreSupplierModel{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int GenreSupplierID { get; set; }
    [ForeignKey("SupplierID")]
    public int SupplierID { get; set; }
    public virtual SupplierModel objSupplier { get; set; }
    [ForeignKey("GenreID")]
    public int GenreID { get; set; }
    public virtual GenreModel objGenre { get; set; }
}
public class SupplierModel{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int SupplierID { get; set; }
    public string SupplierTitle { get; set; }
    public virtual ICollection<SupplierGenreModel> objSupplierGenre { get; set; }
}

BookGenre之间的多对多关系在

中定义
protected override void OnModelCreating(ModelBuilder modelBuilder) {

将其用于BookGenre,并将其另一个副本用于SupplierGenre

   modelBuilder.Entity<BookGenreModel>()
                .HasOne(bc => bc. objBook)
                .WithMany(b => b. objBookGenre)
                .OnDelete(DeleteBehavior.Restrict);
            modelBuilder.Entity< BookGenreModel>()
                .HasOne(bc => bc.objGenre)
                .WithMany(b => b. objBookGenre)
                .OnDelete(DeleteBehavior.Restrict);

在我的Book视图中,我使用它来检索{{1}中已链接但未链接到当前Genre的{​​{1}}的树视图。 }}视图以从那一端获取信息。

Book

我现在要做的是总结一下Supplier,它们的public IQueryable<BookGenreModel> objGenre { get; set; } public IQueryable<GenreModel> objGenreNotLinked { get; set; } public async Task<IActionResult> OnGetAsync(int inputBookID) { objGenre = _context.BookGenres .Include(np => np. objBook) .Where(a => a.BookID == inputBookID) objGenreNotLinked = _context.Genres .Where(c => !_context.BookGenres .Where(a => a.BookID == inputBookID) .Select(b => b.GenreID) .Contains(c.GenreID) ) .Where(c => c.BookID == inputBookID) ; 和其中Books中的Genre s,它们最终看起来像有点像这样,列出了Supplier个,然后列出了与任何Genre不相关的任何孤儿Book,然后列出了与任何Genre不相关的任何孤儿Book Supplier

图书A
-类型A
--供应商A
--供应商B
--供应商C
-类型B
--供应商C
--供应商D
-类型C
图书B
-类型A
--供应商C
-类型D
--供应商B
--供应商C

类型E(孤儿类型-与任何书籍均不相关)
-供应商E
流派F(孤儿流派-与任何书籍均无关)

供应商F(孤立供应商-与任何流派无关)

我假设我应该使用ViewModel整理信息并将其提供给View,在我尝试过的Genre ViewModel中

SummaryList

可以按照您的期望从public SummaryListViewModel(MyContext_context) { objBook = _context.Books .Include(x => x.objBookGenre) } public IQueryable<BooktModel> objBook { get; set; } 端加载数据。我尝试了各种Book等,试图将模型链接在一起没有成功。我是否需要为此ViewModel创建一个类结构来保存数据,或者是否有其他方法可以使一侧向下移动而无需大量单独调用数据库。

0 个答案:

没有答案