如何使用EF一对多关系获取数据

时间:2011-12-12 08:43:04

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

假设导航属性名称为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

答案 1 :(得分:0)

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

为了清楚起见,我在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);