没有实体框架的MVC模式

时间:2016-08-19 07:04:25

标签: c# sql asp.net-mvc

我试图在没有实体框架的情况下实现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真的有必要吗?

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

我试图非常具体,并保持简短的问题,但如果您需要更多详细信息,我可以为您提供。

1 个答案:

答案 0 :(得分:1)

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

但我同意所有人的意见,使用ORM会让你的生活更加愉快。