Asp.net 实体框架7-访问相关实体
我的问题是在二级关系上访问Web应用程序中的相关实体。没有找到与EF7相关的正确答案 让我们从3个类中选取以下示例:一对多-x-多对一Asp.net 实体框架7-访问相关实体,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-5,entity-framework-core,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,Entity Framework Core,我的问题是在二级关系上访问Web应用程序中的相关实体。没有找到与EF7相关的正确答案 让我们从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 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>();
}
通过这种配置,我希望能够从Person模型中获取信息,不仅可以购买信息,还可以购买相关的后续书籍。就像下面的部分视图一样
@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
}
@model.Models.Person
// (...)
@DisplayFor(model=>model.PersonId)//ok-person
@DisplayFor(model=>model.PersonName)//ok-person
@foreach(Model.Buys中的var项目){
@DisplayFor(modeItem=>item.BuyId)//确定-购买
@DisplayFor(modeleItem=>item.Book.Name)//null-Book
}
我是否需要在fluent API中编写额外的引用代码,或者在实体模型中进一步包含,以便能够从个人级别访问项目数据?您应该像购买
一样,包含书籍
。我的意思是:
var person = _context.People
.Include(c => c.Buys.Select(x => x.Book))
.Where(c => c.PersonId == id)
.FirstOrDefault();
但实际上,如果您使用MVC,最好创建包含特定视图所需所有数据的ViewModel
类,而不是查看EF类。在EF 7 beta7中,您还可以使用该方法包括几个级别:
var person = _context.People
.Include(c => c.Buys)
.ThenInclude(b=>b.Book)
.FirstOrDefault(c => c.PersonId == id);
更好的做法是使用所需数据创建自定义模型,并将其填充到控制器中,然后将其传递到视图。我不想创建视图模型,因为我在项目中只有两个多级回迁。依我看,会很混乱。不能像您建议的那个样,将include与适当的关系范围相关联。然而@octavioccl建议使用非常简洁的include-works,就像charm一样。@baftinho好的,你是对的,我将代码更改为工作版本
var person = _context.People
.Include(c => c.Buys.Select(x => x.Book))
.Where(c => c.PersonId == id)
.FirstOrDefault();
var person = _context.People
.Include(c => c.Buys)
.ThenInclude(b=>b.Book)
.FirstOrDefault(c => c.PersonId == id);