三层架构中,把实体类都放在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; }
}
}

解决方案 »

  1.   

    gridview的数据源是IList<User>的对象列表,如果用户角色属性只要一个ID的话,那么要显示角色名的时候,是不是都要调用一个ReName函数?
    <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);
    }
      

  2.   

    为什么MODEL层不能调用BLL层的方法?
      

  3.   

    BLL -》 业务逻辑层(顾名思义)MODEL -> 实体层 (用来保存数据,网站内传递,显示数据的。)正确的方式:bll层引用model  照你的想法:那不成了死循环了嘛(相互引用).
      

  4.   

    但如果要在Model层做按需获取,自然会想到用BLL层的方法。
    public IList<Role> U_Role
    {
        set { _u_role = value; }
        get { return bll.GetRoles(U_ID); }//取的时候就去访问数据库。
    }
      

  5.   


    一个用户有多个角色?private Role _u_role;

    public Role U_Role
    {
        set { _u_role = value; }
        get { return _u_role; }
    }
      

  6.   

    DAL也不一定非要直接访问数据库的啊
      

  7.   

    你去看看petshop里,订单的DAL是怎么实现的,Orders和LineItem是怎么对应的。
    还建议不用外键,不明白你们怎么想的。
      

  8.   

    外键是必定用的,只是形式为另一个类对象还是一个ID的问题。我现在的外键用的是类对象,这样可以比较方便的获取到外键主键以外的属性(如角色名称),但用了类作外键就出现实例化一个对象就要同时实例化很多对象的问题(即使外键的子属性都为NULL),有时还可能出现循环引用问题(如一个歌手属于一个乐队,一个乐队又有一个主唱,所以实例一个歌手类就实例化一个乐队类,又必须实例化一个主唱,而且主唱本身就是歌手类)
    这样的问题怎么解决?
      

  9.   

    解决方案1: Role实体重载ToString方法让其返回“角色名”即可解决方案2: 
    List<User> users=new List<User>();
    var View_users=users.select{c=>new {
    c.U_ID,
    U_Name,
    U_Role.roleName
    }
    }