问题遇到的现象和发生背景
项目中经常遇到列表分页数据展示的业务,比如学生信息列表,它包括的学生姓名、所属班级、学籍号、联系方式、家庭地址等信息,一般我们会设计两张表,学生信息表和班级表,学生所属班级通过学生信息表保存的班级ID关联,列表显示时通过班级ID显示所属班级的名称。表结构(简化)和界面显示如下:
学生表结构:
班级表结构:
列表显示界面:
分页列表模型(当然这里应该是个集合,我只截图出集合中的对象模型):
public class StudentGridViewModel
{
/// <summary>
/// ID
/// </summary>
public string ID { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 账户;与学籍辅号一致。
/// </summary>
public string UserCode { get; set; }
....
#region 扩展字段
public string ClassName { get; set; }
#endregion
}
在没有接触AutoMapper前,我一般时通过SQL语句进行联合查询出列表的模型字段:
select T.*,C.ClassName from EIC_Student as T
join EIC_Class as C on C.ID=T.ClassID
最后模型装载数据后返回给页面使用,在初步了解AutoMapper后,我改为各自查询数据并返回表数据库表模型,也就是分别查询学生信息表和班级信息表:
学生数据库表模型:
/// <summary>
/// 学生信息
/// </summary>
[Serializable]
public class EIC_Student
{
/// <summary>
/// ID
/// </summary>
public string ID { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string UserName { get; set; }
...
}
}
班级信息表数据库模型:
public partial class EIC_Class
{
public EIC_Class()
{ }
#region Model
private string _id;
private string _classname;
...
/// <summary>
///
/// </summary>
public string ID
{
set { _id = value; }
get { return _id; }
}
/// <summary>
/// 班级名称
/// </summary>
public string ClassName
{
set { _classname = value; }
get { return _classname; }
}
....
}
然后将学生数据库信息表模型(EIC_Student)映射为StudentGridViewModel,目前到达这一步没有问题,最后我想将班级信息表数据库模型(EIC_Class)的ClassName映射给StudentGridViewModel的ClassName,但失败了,AutoMapper默认会将两个模型相同字段名称都进行映射,这造成了原先EIC_Student映射给StudentGridViewModel的值全部为空了,只保留了ClassName和ID有值(班级信息表和StudentGridViewModel之间ID和ClassName相同,且其实这个ID值是EIC_Class的ID值也是不对)。
我不知道如何处理这种,无耐之下我暂时的处理方式是循环StudentGridViewModel的每一项(其实是个列表多条数据需要循环),赋值ClassName:
业务逻辑层的代码:
我不知道AutoMapper的使用是否是这样处理以上场景的(联合查询),个人初涉该组件,认为按照AutoMapper的约定所有数据库返回都应该为数据库最原始的模型,然后通过映射为客户端要使用的模型,不应该有联合查询语句。(不知道理解是否有误)!
问题
- 是否所有数据库返回的都应该是数据库表实体,不应该使用联合查询,再使用AutoMapper进行映射?
- 如果问题1成立,那么如何只映射ClassName?如果问题1不对请赐教!