多层模式下的多对多关系如何体现?

把问题总结下吧,留着日后参考:

┌───────┐       ┌───────────┐       ┌───────┐
│       │1     *│           │*     1│       │
│ Role  │------>│ Relation  │<------│Module │
│       │       │           │       │       │
└───────┘       └───────────┘       └───────┘

   用户              关系               模块
--------------------------------------------------
描述:
      用户权限管理
--------------------------------------------------
表结构:
      Role(RID,RName,RSummary……)        用户表
      Relation(RPID,RID(FK),MID(Fk))    关系映射表
      Module(MID,MName……)         系统管理模块表
--------------------------------------------------
架构模式:
      Web、BLL、IDal、Factory、Dal、Model
--------------------------------------------------
主问题:
      如何在显示所有用户(Role)的同时通过关系表(Relation)
      也显示每个用户的多个系统管理模块(Module)名称?
     
      在多对多的模式下Role、Relation、Module 表的
      Model层、DAL层怎么写,怎么建立这种关系?
--------------------------------------------------
附问题:
      在组合查询中,组合条件与SQL语句分别在BLL层、
      DAL层中怎么体现?
--------------------------------------------------
语言:(C#/Net 1.1)
--------------------------------------------------
其他:学习PetShop中……

请大虾帮忙!跪谢!

==================================================

几种解释:

niunj(南航牛) 

这个好办,用户list页面的时候,可以多显示2个功能按钮,一个是关系的设置,一个是模型的设置,
这3者之间的确是相互联系的,但是关键还是两两相连,所以只要处理好两两的关心就可以了。

truecoffeefox(咖啡狐)

可以用试图嘛,也不一定每个model都要对应一个dal

我都是每个表一个model
然后根据情况建立视图,关联了视图的表视情况在视图对应的dal里进行跟新
bll层该干嘛干嘛,一般没它的事

Jinglecat(晓风残月 >> 问题需简洁,错误要详细)

如何在显示所有用户(Role)的同时通过关系表(Relation)
也显示每个用户的多个系统管理模块(Module)名称?

在多对多的模式下Role、Relation、Module 表的
Model层, 怎么建立这种关系?
=====================================================
1,
实体关系模型(数据库)中的关系(外健)在实体对象模型(内存)中是通过 引用 来表示的

2,
对于 多对多 关系,大概分两种情况
 a. 这个关系,不需要独立成一个“关系实体”,直观上看,数据库中这张中间关系表,一般只有两个外键列,那么实体对象模型不是需要一个与之对应的 Relation 类, Role 与 Module 之间是通过 引用 来表现的,而且这个“多”是通过“一”的一个集合表现的,这刚好与数据库相反(数据库通过在“多”那个表的建立外健表现),如这样定义
   public Role {
      // ...
      // public int ID {
      //     get;
      //     set;
      //}
      // ...

      private IList _modules; // .net 2.0 中,建议使用泛型 IList<Module>
      public IList Modules {
          get { return _modules; }
      }
  }

  public Module {
      // ...
      // public int ID {
      //     get;
      //     set;
      //}
      // ...

      private IList _roles;
      public IList Roles {
          get { return _roles; }
      }
  }

   b. 如果你需要在这个关系上附加一些其他的信息(成为一个Role-Module的明细表),那么就需要设计一个类,不妨称为 RoleModuleDetail 来表示,实体对象模型中需要拆成了两个一对多来实现
   
   public Role {
      // ...
      // public int ID {
      //     get;
      //     set;
      //}
      // ...

      private IList _roleModuleDetails; // .net 2.0 中,建议使用泛型 IList<RoleModuleDetail>
      public IList RoleModuleDetails {
          get { return _roleModuleDetails; }
      }
  }

public RoleModuleDetail {
      // ...
      // public int ID {
      //     get;
      //     set;
      //}
      // ...

     private Role _role;
     public Role Role {
         get { return _role; }
     }
   
     private Module _module;
     public Module Module {
         get { return _module; }
     }     
}

  public Module {
      // ...
      // public int ID {
      //     get;
      //     set;
      //}
      // ...

      private IList _roleModuleDetails; // .net 2.0 中,建议使用泛型 IList<RoleModuleDetail>
      public IList RoleModuleDetails {
          get { return _roleModuleDetails; }
      }
  }


在多对多的模式下Role、Relation、Module 表的
DAL层怎么写,怎么建立这种关系?
================================
3.
关于这个加载数据的问题,讨论起来实在太庞大了,涉及到方方面面,如是否使用连接,何种连接(内、外连接),是否延时加载,
比较简单的就是按表模块,一个个Model的加载,
希望其他大虾,给出好的建议

4.
在组合查询中,组合条件与SQL语句分别在BLL层、
DAL层中怎么体现?
==============
原则上设计, UI, BLL 都不应该有 SQL 语句痕迹的出现, 而是用Model的属性表示,并加上自定义的一套查询参数组合模式,传递到 DAL, 由 DAL 构造 SQL 语句(或者由存储过程实现)

查询参数组合模式
=========
比如,我定义一个可以表示三个关联对象的类 FilterTriplet,
public FilterTriplet {
   public string PropertyName { //表示Model属性
       get;
       set;
   }
 
   public string PropertyValue { //表示要匹配的值
       get;
       set;
   }

   public string Operator { //表示运算符
       get;
       set;
   }
 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值