2

我的問題是訪問第二層關係上的Web App中的相關實體。沒有找到與EF7相關的正確答案。實體框架7 - 訪問相關實體

讓我們來看看以下3個類的示例:一對多 - x - 多對一。

public class Person { 
    public int PersonId { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Buy> Buys { get; set; } = new List<Buy>(); 
} 

public class Buy { 
    public int BuyId { get; set; } 
    public int PersonId { get; set; } 
    public int BookId { get; set; } 

    public virtual Person Person { get; set; } 
    public virtual Book Book { get; set; } 
} 

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

    public virtual ICollection<Buy> Buys { get; set; } = new List<Buy>(); 
} 

具有上下文。

public class MyContext : DbContext { 
    public DbSet<Person> People { get; set; } 
    public DbSet<Book> Books { get; set; } 
    public DbSet<Buy> Buys { get; set; } 
} 

protected override void OnModelCreating(ModelBuilder modelBuilder) { 
     modelBuilder.Entity<Person>() 
      .Collection(c => c.Buys).InverseReference(c => c.Person) 
      .ForeignKey(c => c.PersonId); 

     modelBuilder.Entity<Book>() 
      .Collection(i => i.Buys).InverseReference(i => i.Book) 
      .ForeignKey(i => i.BookId); 
} 

Person Controller - Details view。

// _context present in given scope 
public IActionResult Details(int? id) { 
    var person = _context.People 
      .Include(c => c.Buys) 
      .Where(c => c.PersonId == id) 
      .FirstOrDefault(); 
} 

有了這個配置我旨在能夠從人物模型獲取,不僅收購的信息,但也涉及進一步的書籍。就像View的一部分一樣。

@model <project>.Models.Person 
// (...) 

@Html.DisplayFor(model => model.PersonId)  // ok - person 
@Html.DisplayFor(model => model.PersonName) // ok - person 

@foreach (var item in Model.Buys) { 
    @Html.DisplayFor(modeItem => item.BuyId)  // ok - buy 
    @Html.DisplayFor(modelItem => item.Book.Name) // null - book 
} 

我需要用流利的API編寫額外的引用或做進一步包括在實體模型能夠從人級訪問項目的數據?

+0

更好的做法是進行自定義模型所需的數據,並在控制器填充它,然後將它傳遞給視圖 –

回答

0

在EF 7β7的,你也可以使用ThenInclude方法包括幾個層次:

var person = _context.People 
        .Include(c => c.Buys) 
        .ThenInclude(b=>b.Book) 
        .FirstOrDefault(c => c.PersonId == id); 
+0

Works ok。謝謝。 – baftinho

+0

不客氣。 – octavioccl

2

您應該像Buys一樣包括Book。我的意思是:

var person = _context.People 
     .Include(c => c.Buys.Select(x => x.Book)) 
     .Where(c => c.PersonId == id) 
     .FirstOrDefault(); 

但實際上,如果你用MVC工作,最好創建ViewModel類,有你需要的特定視圖,而不是對你查看EF類的所有數據。

+0

我不想創建ViewModels,因爲我在項目中只有2個多級提取。海事組織,它會混亂。 無法鏈接包含與您建議的適當關係範圍的願景。然而@octavioccl建議非常整潔ThenInclude - 像魅力一樣。 – baftinho

+0

@baftinho好的,你說得對,我把我的代碼更改爲工作版本 –