没有实体框架的MVC模式
本文关键字:MVC 模式 框架 实体 | 更新日期: 2023-09-27 18:03:08
我试图实现一个没有实体框架的MVC应用程序,而不是我使用数据表来填充我的业务对象,但我有很多问题。
假设我有这样一个简单的类: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类必须有一个导航属性来获取Phones,而Phone类必须有一个到Person的导航属性。因此,如果我必须显示带有电话的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真的是必要的吗?
不知何故,这是实体框架的行为,我只是试图模仿以最少的查询次数获得数据。
我试着非常具体,保持问题简短,但如果你需要更多的细节,我可以提供给你。
对于将数据从一个对象映射到另一个对象,我会使用AutoMapper,其他工具也可用。
但是我同意大家的观点,使用ORM会让你的生活快乐32%。