没有实体框架的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真的是必要的吗?

不知何故,这是实体框架的行为,我只是试图模仿以最少的查询次数获得数据。

我试着非常具体,保持问题简短,但如果你需要更多的细节,我可以提供给你。

没有实体框架的MVC模式

对于将数据从一个对象映射到另一个对象,我会使用AutoMapper,其他工具也可用。

但是我同意大家的观点,使用ORM会让你的生活快乐32%。