2016-08-19 131 views
0

我想实现一个没有实体框架的MVC应用程序,而是使用数据表来填充我的业务对象,但我有很多问题。没有实体框架的MVC模式

假设我有这个简单的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类必须有一个导航属性来获取手机及手机类必须有一个导航属性的人。所以,如果我要显示与电话的人名单,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; 
} 

而在去年,我的视图模型:

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

最好在多个帖子中提问你的问题。首先,你为什么不想使用EF?对于分页数据,它取决于您使用的SQL Server版本,例如,您可以在SQL 2014中使用OFFSET,在另一版本中使用Row_number。 –

+0

在我的书中,PersonForList是没有必要的。我认为你可以用EF来更好地完成你的查询。 –

+0

在我的工作中,我们使用自己的ORM,但实际上不支持连接,所以,当需要连接时,我们需要进行原始查询,然后手动映射结果。我正在使用SQL Server 2014. –

回答

0

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

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