World Of ιζσεα.

欢迎来到叉叉的菠萝阁

 

NetTiers学习笔记01---调用Data层操作数据

例子中4个对象的关系图如下 详细的生成方式可以查看官方的文档,本文选用了service


共包含7部分
1.通过住外键,唯一键查询
2.数据的添加
3.更新
4.保存(自动判断对象是否是新的)
5.DeepSave DeepLoad(主从表载入?)
6.事务
7.查询



  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using MessageBoard.Entities;        //命名空间 (实体)
  5 using MessageBoard.Data;            //命名空间 (数据访问层)
  6 
  7 
  8 namespace MessageBoard.Services
  9 {
 10 
 11     public class Step01GetByKey
 12     {
 13 
 14         public static Users GetByPk(int userId)
 15         {
 16             return DataRepository.UsersProvider.GetByID(userId);                //如果表建立了主键 则自然会有此方法
 17         }
 18 
 19         public static TList<Opinions> GetByFK(int userId)
 20         {
 21             return DataRepository.OpinionsProvider.GetByUserID(userId);    //如果2个表建立了外键,自然会有外键查询的方法 返回的是TList
 22         }
 23 
 24         public static Users GetByIX(string userName)
 25         {
 26             return DataRepository.UsersProvider.GetByName(userName);    //如果表地某个字段建立了唯一键,也可以通过唯一键查询
 27         }
 28 
 29     }
 30 
 31     public class Step02Add
 32     {
 33 
 34         public static void Add(Users user)
 35         {
 36             DataRepository.UsersProvider.Insert(user);                    //添加一条
 37         }
 38 
 39         public static void Add(TList<Users> user)
 40         {
 41             DataRepository.UsersProvider.Insert(user);                    //添加多条
 42         }
 43 
 44     }
 45 
 46     public class Step03Update
 47     {
 48 
 49         public static void Update(Users user)
 50         {
 51             DataRepository.UsersProvider.Update(user);                    //更新一条
 52         }
 53 
 54         public static void Update(TList<Users> user)
 55         {
 56             DataRepository.UsersProvider.Update(user);                    //更新多条
 57         }
 58 
 59     }
 60     public class Step04Save
 61     {
 62 
 63         public static void Save()
 64         {
 65             Users u = new Users();
 66             u.Name = "AAA";
 67             DataRepository.UsersProvider.Save(u);                    // 自动调用add
 68 
 69             u.Name = "BBB";
 70             DataRepository.UsersProvider.Save(u);                    //调用update  通过isduty属性来判断是否是脏 isnew判断是否新
 71 
 72         }
 73 
 74         /// <summary>
 75         /// 查找跟当前对象有关联的子对象或父对象
 76         /// </summary>
 77         public class Step05Deep
 78         {
 79 
 80             public static void DeepLoad(string name)
 81             {
 82                 TList<Users> user = DataRepository.UsersProvider.GetAll();        //查找全部
 83                 DataRepository.UsersProvider.DeepLoad(user, false, DeepLoadType.IncludeChildren, typeof(TList<Email>), typeof(TList<Opinions>), typeof(TList<Address>));
 84 
 85                 //有11个重载 举一个最常用的, 第一个参数需要深度载入的对象,第二个是否递归,第三个参数选择载入类型(包含指定对象,忽略,不包含指定)这里是指定了需要载入的对象,后面是params type类型的参数,用于设置需要载入的类型 1对多用Tlist<类型> 多对1直接用类型
 86             }
 87 
 88             public static void DeepSave(Users user, params Type[] childTypes)        //保存对象及其子对象与deepload对应
 89             {
 90                 DataRepository.UsersProvider.DeepSave(user, DeepSaveType.IncludeChildren, childTypes);
 91             }
 92 
 93         }
 94 
 95         /// <summary>
 96         /// 事务
 97         /// </summary>
 98         public class Step06Trans
 99         {
100 
101             public static void SendAnOpinion(Opinions opinion, string userName)
102             {
103                 TransactionManager tm = DataRepository.Provider.CreateTransaction();
104 
105                 tm.BeginTransaction();
106 
107                 try
108                 {
109                     Users user = DataRepository.UsersProvider.GetByName(userName);
110                     if (user == null)
111                     {
112                         user = new Users();
113                         user.Name = userName;
114 
115                         DataRepository.UsersProvider.Save(tm, user);
116                     }
117                     opinion.UserID = user.ID;
118 
119                     DataRepository.OpinionsProvider.Save(tm, opinion);
120 
121                     tm.Commit();                    //提交事务
122                 }
123                 catch
124                 {
125                     tm.Rollback();                    //回滚事务
126                     throw;
127                 }
128             }
129 
130         }
131 
132         public class Step07Find
133         {
134 
135             public TList<Opinions> FindByDate(DateTime startDate, DateTime endDate, int userId)
136             {
137                 SqlFilterBuilder<Opinions> sFB = new SqlFilterBuilder<Opinions>();
138 
139                 sFB.AppendEquals(OpinionsColumn.UserID, userId);
140 
141                 sFB.AppendRange(OpinionsColumn.OpinionDate, startDate.ToString(), endDate.ToString());
142 
143                 return DataRepository.OpinionsProvider.Find(sFB.ToString());
144             }
145         }
146 
147     }
148 }
149 


源代码等后面教程写完一起放出

即将推出
实体属性的扩展
NetTiers的实体数据源的使用

posted on 2007-04-20 16:38 Ψιζσεα. 阅读(2078) 评论(23)  编辑 收藏 所属分类: 技术.NetTiers

评论

#1楼  2007-04-20 17:33 Apple [未注册用户]

请教下为什么都是static 我一般都是要new一下   回复  引用    

#2楼 [楼主] 2007-04-20 17:36 iCaca      

呵呵 例子而已,例子而已.
不使用static更好些:)
我么喜欢偷懒...免得一次次new了...   回复  引用  查看    

#3楼  2007-04-20 17:40 Apple [未注册用户]

那么我要是和你一样都用static 会不会有什么影响 比如什么并发什么的
性能什么的方面会有什么损失吗?   回复  引用    

#4楼  2007-04-20 17:41 Apple [未注册用户]

我也觉得new的很麻烦 呵呵 有时候要new N多个   回复  引用    

#5楼  2007-04-20 17:46 Flykye [未注册用户]

好。。我用了那么就NetTiers
对他还没有了解透彻呢。。
希望博主写出多点经验出来交流交流。
期待博主的文章   回复  引用    

#6楼 [楼主] 2007-04-20 18:45 iCaca      

@Flykye
谢谢,最近公司在用这个开发合同管理,所以一直在研究.   回复  引用  查看    

#7楼  2007-05-08 22:19 moon [未注册用户]

请问下Find要分页怎么操作   回复  引用    

#8楼 [楼主] 2007-05-09 10:12 iCaca      

@moon

int totalrecorder;
service.Find("a=1", 0, 10, out totalrecorder);

第四,第五个重载
  回复  引用  查看    

#9楼  2007-05-12 16:26 moon [未注册用户]

楼主怎么不继续写了啊,期待中!!   回复  引用    

#10楼  2007-07-04 11:18 yiwl [未注册用户]

@moon
icaca有fans 了!   回复  引用    

#11楼  2007-07-20 01:30 icezs [未注册用户]

想把deepload得到的SecurityUser组合成TList,要怎么写呢
TList<MRP.Entities.SecurityUser> list=new TList<SecurityUser>();
MRP.Data.DataRepository.SecurityUserProvider.GetAll();
HROrganization hro=DataRepository.HROrganizationProvider.GetByDepart_ID(3);
DataRepository.HROrganizationProvider.DeepLoad(hro, false, DeepLoadType.IncludeChildren, typeof(TList<HREmployees>), typeof(TList<SecurityUser>));
foreach (HREmployees hre in hro.HREmployeesCollection)
{
int i = 0;
list.
hre.SecurityUser.;
i += 1;
}
bindingSource1.DataSource = list;   回复  引用    

#12楼  2007-07-20 01:39 icezs [未注册用户]

想把deepload得到的SecurityUser组合成TList<SecurityUser>,要怎么写呢
HREmployees表
Emp_ID(人员编号),Emp_Name,Depart_ID
SecurityUser表
User_ID,User_Name,Password,Emp_ID

TList<HREmployees> hres = DataRepository.HROrganizationProvider.GetByDepart_ID(3);
DataRepository.HREmployeesProvider.DeepLoad(hres, false, DeepLoadType.IncludeChildren, typeof(TList<SecurityUser>));
foreach (HREmployees emp in hres)
{
list emp.SecurityUser???
}   回复  引用    

#13楼  2007-07-20 02:43 icezs [未注册用户]

http://community.csdn.net/Expert/topic/5664/5664846.xml?temp=.82539   回复  引用    

#14楼 [楼主] 2007-07-20 09:19 iCaca      



HREmployees跟SecurityUser 是什么关系???

TList<SecurityUser> secList=new TList<SecurityUser>();
foreach (HREmployees emp in hres)
{
secList.AddRange(emp.SecurityUserCollection);
}



如果是1对n 推荐你还是做个视图,或者存储过程, 要不然性能太差了   回复  引用  查看    

#15楼  2007-07-20 11:19 icezs [未注册用户]

万分谢谢你的回复。
是一对一的,对Emp_ID字段在表SecurityUser(用户表,其中有password字段)中建了唯一索引,其它字段 User_ID, User_Name, Password, Decription, Emp_ID
Emp_ID是表HREmployees(雇员表)的主键.其它部门字段Emp_ID, Emp_Name, Depart_ID(外键关联到HROrganization).
还有一张是部门表HROrganization, 字段:Depart_ID(主键), Depart_Name, Parent_ID
SecurityUser的Emp_ID关联到表HREmployees的Emp_ID(主键)
是否可以把Emp_Name,Depart_ID,Depart_Name做的SecirutyUser Entity的扩展属性?我有看你的扩展属性文章,“没有使用Deepload” 是不是要在代码中使用Deepload呢。
另外,我数据表都是用[模块名.表名],如果[HR.Organization],[Security.User],[HR.Employees]。有看你的使用自定义储存过程,"1. 设置自定义存储过程的前缀 {0}==表名, {1}==存储过程前缀(可有可无),",这里的我表名应该是“HR.Organization"还是"HR.Organization"。
   可以放个源代码出来吗。
  回复  引用    

#16楼  2007-07-20 11:26 icezs [未注册用户]

还有,不太清楚ComponentLayer的作用(已经有了BussinessLogicLayer和DataAccessLayer)。
可以说一下吗   回复  引用    

#17楼 [楼主] 2007-07-20 13:44 iCaca      

Entity层 称为业务逻辑, 从原子上达到数据的准确
Data层 跟我们的dal一样 只是实现是在data.sqlclient
service层 负责封装data层的操作, 事务等


问: 为何在entity实现业务逻辑 而非service?
答: service可以实现业务逻辑, 但是每一个方法都验证业务逻辑是不是很繁琐?
如果我们从更原子的地方去实现业务逻辑, 那么我们只需要实现一次.

可以在属性赋值时验证数据,如身份证,生日等

  回复  引用  查看    

#18楼 [楼主] 2007-07-20 13:55 iCaca      

@icezs
存储过程的代码,就在截图里, 使用的就是数据库中的表名,我也是对表进行了分类,不过分隔符与你的不同,我用的是"_", 我没有尝试过在表名中使用"." , 你试试看, 用[_HR.Organization_SayHelloWorld] 会不会报错

可以扩展属性, 不过需要在调用时 Deepload.   回复  引用  查看    

#19楼  2007-08-13 15:24 jhtchina      

如何和nunit连接起来与数据库进行测试?
  回复  引用  查看    

#20楼 [楼主] 2007-08-13 15:54 iCaca      

nettiers 生成的时候可以选择 单元测试
可以选nunit或vsts
  回复  引用  查看    

#21楼 [楼主] 2007-08-13 15:55 iCaca      

并却会生成测试方法 涵盖了所有的查询插入删除 等操作
  回复  引用  查看    

#22楼  2007-10-31 09:08 QQ:420571718 [未注册用户]

它给我最大的好处就是支持视图,里面
DataRepository.ViewProvider.find(query.getper..,"column asc");是最有用的。。^_^   回复  引用    

#23楼 [楼主] 2008-01-16 11:17 Ψιζσεα.      

--引用--------------------------------------------------
QQ:420571718: 它给我最大的好处就是支持视图,里面
DataRepository.ViewProvider.find(query.getper..,"column asc");是最有用的。。^_^
--------------------------------------------------------

多用用内置的排序方法 比直接写sql好许多

特别是在sql 和oracle 语法不同时   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-05-09 10:21 编辑过
成果网帮您增加网站收入


相关链接:
 

导航

统计

与我联系

搜索

 

常用链接

留言簿

随笔分类(49)

随笔档案(15)

新闻档案(1)

相册

最新随笔

积分与排名

最新评论

阅读排行榜

评论排行榜