如何在一对多关系上使用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}
}
答案 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>
}
}
或者您可以使用WebGrid
,MvcContrib 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);