2011-12-12 76 views
0

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

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

现在我想与街道一起显示人的详细信息(即什么存放在streetLivedInTable),他/她住在。
假设我有一个人的EntitySet

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

回答

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

+0

那么如何来显示它在我的观点(比如有多个街道单次入境)html.displayfor(model.name)和html.displayfor(model.streets) – RollerCosta

+0

即一个人可以拥有多个街道再如何将这两个表中的数据显示在一个ViewTable中 – RollerCosta

+0

我已经尝试过你的代码,如果有多对一的关系,并且它可以正常工作,但是在一对多关系中它不起作用 – RollerCosta

0

假设你不想直接暴露实体框架数据模型视图,而是做一个转换业务对象创建,我只需用双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); 
+0

请注意,如果您不介意将EF对象模型展示给View,那么问题中的两行代码就是答案 - 您直接在View中迭代对象。 – Nilzor