Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 实体框架7-访问相关实体_Asp.net_Asp.net Mvc_Entity Framework_Asp.net Mvc 5_Entity Framework Core - Fatal编程技术网

Asp.net 实体框架7-访问相关实体

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>(

我的问题是在二级关系上访问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 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);