我试图在没有实体框架的情况下实现MVC应用程序,而是使用数据表来填充我的Business Objects,但我有很多问题。
假设我有这个简单的clasess:
public class Person {
public int Id { get; set; }
public string Name { get; set; }
}
public class Phone {
public int Id { get; set; }
public string PhoneNumber { get; set; }
public int PersonId { get; set; }
}
如果我使用EF,Person类必须具有导航属性才能获得电话,而Phone类必须具有Person的导航属性。因此,如果我必须显示带有电话的人员列表,则sql结果应如下所示:
------------------------------------------------------------
| **PersonId** |**Name** | **PhoneId** | **PhoneNumber** |
------------------------------------------------------------
| 1 | John Doe | 1 | 111-55-5855 |
------------------------------------------------------------
| 1 | John Doe | 2 | 111-55-5521 |
------------------------------------------------------------
| 2 | Mary Jane| 3 | 254-565-855 |
------------------------------------------------------------
| 3 | J. Watson| NULL| NULL|
------------------------------------------------------------
到目前为止,我所做的是:
在我看来,我必须以这种格式显示联系人:
------------------------------------------------------------
|**Name** | ** Phones ** |
------------------------------------------------------------
| John Doe | 111-55-5855, 111-55-5521 |
------------------------------------------------------------
| Mary Jane| 254-565-855 |
------------------------------------------------------------
| J. Watson| - |
------------------------------------------------------------
我创建了第三堂课,我不知道它是否是必要的。在这个类中,我存储了我的sql查询返回的结果。这个结果与上面的第一个表完全相同,它等于EF将返回的结果。
public class PersonForList {
public int PersonId { get; set; }
public string PersonName { get; set; }
public int PhoneId { get; set; }
public string PhoneNumber { get; set; }
}
我有一个使用此方法的PersonManager:
public List<PersonForList> GetPeopleWithPhones {
List<PersonForList> people = new List<PersonForList>();
SqlCommand command = new Command(query);
var dt = ExecuteDataTable(command);
foreach(DataRow row in dt.Rows){
var person = new PersonForList() {
... Fill object
PersonId = (int)row["PersonId"],
...
}
people.Add(person);
}
return people;
}
最后,我的viewmodel:
public class PersonListViewModel {
public int PersonId { get; set; }
public string PersonName { get; set; }
public string Phones { get; set; }
}
(如果你真的走到这一步,你一定是一个非常有耐心的人= S)
问题:
如果我必须对我的列表进行分页,我如何计算不同的记录,但仍然在我的查询中包含所有手机?...例如,如果页面大小为3,使用我当前的查询,我将仅检索John Doe和Mary Jane Phones,因为这是3行,但不适合不同的人。
如何填充我的视图模型?我不知道如何遍历列表以便让一个人拥有他所有的手机。
我的班级PersonForList真的有必要吗?
不知何故,这是实体框架的行为,我只是试图模仿以最少的查询数量获取数据。
我试图非常具体,并保持简短的问题,但如果您需要更多详细信息,我可以为您提供。
答案 0 :(得分:1)
为了将数据从一个对象映射到另一个对象,我会使用AutoMapper,其他工具也可用。
但我同意所有人的意见,使用ORM会让你的生活更加愉快。