【问题标题】:How to fetch data with EF one to many relationship如何使用 EF 一对多关系获取数据
【发布时间】:2011-12-12 08:43:03
【问题描述】:

如何在一对多关系中使用 EF 获取数据。
即,如果我有一个表名 Person(personID 作为主键)和另一个表名 streetLivedIn(personID 作为外键)。 现在我强制我的控制器方法传递一个人类型的对象

var persons=db.persons();
return View(persons);

现在我想显示人员详细信息以及他/她居住的街道(即存储在 streetLivedInTable 中的内容)。
假设我有一个人的实体集

public class Persons
{
   public string Name{get;set;}
   //NAVIGATIONL PROP. 
   public virtual ICollection<streetLivedIn>{get;set}
}

【问题讨论】:

    标签: c# asp.net-mvc entity-framework


    【解决方案1】:

    假设导航属性名称是Streets

    public class Persons
    {
       public string Name { get; set; }
       //NAVIGATIONL PROP. 
       public virtual ICollection<streetLivedIn> Streets { get; set }
    }
    

    然后您可以使用Include 方法来预先加载此属性。

    var persons = db.persons.Include("Streets");
    return View(persons);
    

    您可以通过多种方式显示它。例如

    @foreach (var person in Model)
    {
         <div>@person.Name</div>
    
             @foreach (var street in person.Streets)
             {
                   <div>@street.Name</div>
             }
    }
    

    或者你可以使用WebGridMvcContrib Grid

    【讨论】:

    • 然后如何在我的视图中显示它(就像多条街道有一个条目) html.displayfor(model.name) 和 html.displayfor(model.streets)
    • 即一个人可能拥有多条街道,那么如何在单个 ViewTable 中显示这两个表中的数据
    • 我已经在多对一关系的情况下尝试了你的代码,它可以正常工作,但在一对多关系中它不起作用
    • 还有一件事“我可以在不使用包含在我的操作中的情况下访问街道属性”什么是“早期加载”??(我对这项技术非常陌生。所以请不要介意我是问你一些傻事)
    • @Gimmebrkk 它将急切地加载Streets 属性。否则实体框架将为每个人实体向数据库发出额外的查询。检查Select N+1
    【解决方案2】:

    假设您不想将实体框架数据模型直接暴露给视图,而是转换为您创建的业务对象,我将简单地使用双 foreach 循环迭代 EF 数据模型。 Entity Framework 使用包含为您创建一对多引用 - 为什么不利用它。

    为了清楚起见,我在 EF 生成的类前面加上“Ef”。

    var personList = new List<Person>();
    foreach (var efPerson in EfPersons)
    {
        var person = new Person
        { 
            Name = efPerson.Name,
            StreetsLivedIn = new List<StreetLivedIn>();
        }
        foreach (var efStreet in efPerson.EfStreetsLivedIn)
        {
            var street = new StreetLivedIn { Name = efStreet.Name; }
            person.StreetsLivedIn.Add(street);
        }
        personList.Add(person);
    }
    return View(personList);
    

    【讨论】:

    • 请注意,如果您不介意将 EF 对象模型暴露给视图,那么您问题中的两行代码就是答案 - 您可以直接在视图中迭代对象。
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多