三层架构中,把实体类都放在Model层,业务层为BLL,数据访问层为DAL。
我有一个User实体类,里面有一个外籍角色属性U_Role,参照另一个Role实体类,因为是多角色制,就用了IList<>,但问题也就来了。
当我实例化User的时候,就必须同时获取角色列表,而实例化一个角色对象,又要实例化多个权限对象。
一开始通过联合查询把所有数据(包括对应全部角色,全部权限号)查出来赋给用户对象,所有属性都有值,但觉得这样太浪费了,因为有时仅需要查一个name而已。
后来尝试只加载用户的基本属性,在使用Role角色属性的时候才去调用BLL层的.GetRoles方法,但却有第二个问题出现,例如当我要用列表显示30个用户的时候(包括用户名和角色名),因为角色名并没有值的,需要用GetRoles方法,所以就要对每一个用户调用GetRoles一次,那么单获取每个用户的角色名就要调用30次GetRoles,也就是要open和close数据库30次,感觉非常不合理。而且调用方法还得写在aspx的cs文件中,不能写在Model类中,因为Model调用不了BLL,添加不了引用。
该如何设计这个外键,如何去按需获取又不损效率?
public class User
{private int _u_id;
private string _u_name;
private IList<Role> _u_role=new List<Role>;public int U_ID
{
set { _u_id = value; }
get { return _u_id; }
}
public string U_Name
{
set { _u_name = value; }
get { return _u_name; }
}
public IList<Role> U_Role
{
set { _u_role = value; }
get { return _u_role; }
}
}
我有一个User实体类,里面有一个外籍角色属性U_Role,参照另一个Role实体类,因为是多角色制,就用了IList<>,但问题也就来了。
当我实例化User的时候,就必须同时获取角色列表,而实例化一个角色对象,又要实例化多个权限对象。
一开始通过联合查询把所有数据(包括对应全部角色,全部权限号)查出来赋给用户对象,所有属性都有值,但觉得这样太浪费了,因为有时仅需要查一个name而已。
后来尝试只加载用户的基本属性,在使用Role角色属性的时候才去调用BLL层的.GetRoles方法,但却有第二个问题出现,例如当我要用列表显示30个用户的时候(包括用户名和角色名),因为角色名并没有值的,需要用GetRoles方法,所以就要对每一个用户调用GetRoles一次,那么单获取每个用户的角色名就要调用30次GetRoles,也就是要open和close数据库30次,感觉非常不合理。而且调用方法还得写在aspx的cs文件中,不能写在Model类中,因为Model调用不了BLL,添加不了引用。
该如何设计这个外键,如何去按需获取又不损效率?
public class User
{private int _u_id;
private string _u_name;
private IList<Role> _u_role=new List<Role>;public int U_ID
{
set { _u_id = value; }
get { return _u_id; }
}
public string U_Name
{
set { _u_name = value; }
get { return _u_name; }
}
public IList<Role> U_Role
{
set { _u_role = value; }
get { return _u_role; }
}
}
解决方案 »
- 怎么用frameset中的多个frame切换无刷新,用AJAX如何实现?
- 全新安装到BBS目录下出现:未能加载文件或程序集“Discuz.Forum”或它的某一个依赖项。系统找不到指定的文件
- 100分求代码上传到blog格式丢失问题
- datagrid往新页面传递参数的问题
- 高分求助 在线等呀!
- 怎么没有人回答啊
- 广州 高科大厦 创业团队 找合作伙伴
- 这个要求不过份啊!!可咋那么难实现呢?关于DataGrid的,求知若渴啊,100分,解决了再加100分!!具体请进来看看!
- MyAdapter.Fill (ds,"STAM_BASE_TABLE"); 这第二个参数是什么意思呢?可以随便填一个吗?
- 昨天还好好的,今天怎么出现这样的错误?大家帮忙看看啊,谢谢了!
- eWebeditor修改新闻的问题.net
- 关于C#操作word问题,大侠进来帮帮忙
<asp:GridView ID="GridViewList" runat="server"
AutoGenerateColumns="False" >
<Columns>
<asp:TemplateField HeaderText="操作" >
<ItemTemplate>
<asp:LinkButton ID="LinkButton1" runat="server" Text='<%#ReName(Eval(U_RoleID).ToString())%>'></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
...后台:
public string GetRoleName(string value)
{
...
return bll.GetRoleName(value);
}
public IList<Role> U_Role
{
set { _u_role = value; }
get { return bll.GetRoles(U_ID); }//取的时候就去访问数据库。
}
一个用户有多个角色?private Role _u_role;
public Role U_Role
{
set { _u_role = value; }
get { return _u_role; }
}
还建议不用外键,不明白你们怎么想的。
这样的问题怎么解决?
List<User> users=new List<User>();
var View_users=users.select{c=>new {
c.U_ID,
U_Name,
U_Role.roleName
}
}