DongLiORM简介:
DongLiORM是一个基于.net framework 2.0 的,开源的轻量级的ORM产品。目前仅支持Sql Server 2000及其以上版本。支持1-N映射关系,不用写专门的配置文件,比Castle更加简便(当然,功能就……^_^)。
示例:
1、首先在app.Config的appSettings节中加入如下语句:
2) 查询
3)修改,假设修改前面的AUser
备注:
1)关于级联查询、DML:
在1-N关系中,如果调用GetDataByCondition,会把所有相关的N层属性全部填充,如果只想查询本身, 则可以用GetSelfDataByCondition,对于删除操作,如果删除上级,则下级会跟着删除。对于Update,则不会跟着更改下级的外键,需自己手动更改。对于新增操作,会将所有的上级和下级数据全部存入数据库。
2)关于事务处理:
系统没有提供默认的事务支持功能,不过调用的时候可以用一下语句:
大量运用反射,没有做过严格的测试(所以性能应该不会很高)。这方面还有大量可以优化的地方(至少还可以用到缓存,但目前我还没有这样做)。
4)关于版权:
既然说了开源,当然可以自由传播,修改,可以不加任何限制做商业用途,前提是保留第一版作者在源代码中的 版权描述,如果我将来有幸可以开公司,那么你不能跟我打这方面的官司:说这是你注册了的,有版权/专利权的产 品,我必须赔偿你的损失等等。
DongLiORM 源码
这是我的第一个公开作品,欢迎大家拍砖。
刘永红< Yahongq111@163.com>
2007-06-06
DongLiORM是一个基于.net framework 2.0 的,开源的轻量级的ORM产品。目前仅支持Sql Server 2000及其以上版本。支持1-N映射关系,不用写专门的配置文件,比Castle更加简便(当然,功能就……^_^)。
示例:
1、首先在app.Config的appSettings节中加入如下语句:
<!--
数据链接字符串
-->
< add key ="DbCon" value ="server=dbserver;UID=sa;PWD=1234;database=TQM_2007;Pooling=true;Max Pool Size=50; Min Pool Size=10;" />
<!-- 发送Email的帐号 -->
< add key ="EmailUser" value ="EmailUser" />
<!-- 发送Email帐号的密码 -->
< add key ="EmailPwd" value ="Email Password" />
<!-- 发送Email的Server -->
< add key ="EmailServer" value ="EmailServerName" />
<!-- 是否发送Email,如果为false,则不会发送Email -->
< add key ="SendEmail" value ="true" />
<!-- 在Select Top N语句中N的缺省值 -->
< add key ="DefaultTop" value ="300" />
< add key ="DbCon" value ="server=dbserver;UID=sa;PWD=1234;database=TQM_2007;Pooling=true;Max Pool Size=50; Min Pool Size=10;" />
<!-- 发送Email的帐号 -->
< add key ="EmailUser" value ="EmailUser" />
<!-- 发送Email帐号的密码 -->
< add key ="EmailPwd" value ="Email Password" />
<!-- 发送Email的Server -->
< add key ="EmailServer" value ="EmailServerName" />
<!-- 是否发送Email,如果为false,则不会发送Email -->
< add key ="SendEmail" value ="true" />
<!-- 在Select Top N语句中N的缺省值 -->
< add key ="DefaultTop" value ="300" />
2、建立自己的业务类
1)1-1示例
using
System;
namespace BUL.Security
{
/// <summary>
/// 实体类UserItem 。(属性说明自动提取数据库字段的描述信息)
/// 需要注意的是,属性名必须和字段名一一对应,这样就可以少些好多的配置文件了。
/// 如果用过大名鼎鼎的NHibernate,你可能知道我为什么这样说了^_^。
/// </summary>
///
[DongLiORM.BusinessAtrribute("UsersView" //对应的数据表名称
,new string[]{"UserID"} //对应数据表的主键
,typeof(UserItem) //对应的业务对象类型
)]
public class UserItem:DongLiORM.BusinessObject
{
public UserItem()
{ }
private string _userid;
private string _username;
private string _pwd;
private string _email;
/// <summary>
///
/// </summary>
public string UserID
{
set { _userid = value; }
get { return _userid; }
}
/// <summary>
///
/// </summary>
public string UserName
{
set { _username = value; }
get { return _username; }
}
/// <summary>
///
/// </summary>
public string Pwd
{
set { _pwd = value; }
get { return _pwd; }
}
/// <summary>
///
/// </summary>
public string Email
{
set { _email = value; }
get { return _email; }
}
}
}
namespace BUL.Security
{
/// <summary>
/// 实体类UserItem 。(属性说明自动提取数据库字段的描述信息)
/// 需要注意的是,属性名必须和字段名一一对应,这样就可以少些好多的配置文件了。
/// 如果用过大名鼎鼎的NHibernate,你可能知道我为什么这样说了^_^。
/// </summary>
///
[DongLiORM.BusinessAtrribute("UsersView" //对应的数据表名称
,new string[]{"UserID"} //对应数据表的主键
,typeof(UserItem) //对应的业务对象类型
)]
public class UserItem:DongLiORM.BusinessObject
{
public UserItem()
{ }
private string _userid;
private string _username;
private string _pwd;
private string _email;
/// <summary>
///
/// </summary>
public string UserID
{
set { _userid = value; }
get { return _userid; }
}
/// <summary>
///
/// </summary>
public string UserName
{
set { _username = value; }
get { return _username; }
}
/// <summary>
///
/// </summary>
public string Pwd
{
set { _pwd = value; }
get { return _pwd; }
}
/// <summary>
///
/// </summary>
public string Email
{
set { _email = value; }
get { return _email; }
}
}
}
2)1-N示例
using
System;
using System.Collections;
using System.Text;
namespace BUL.Security
{
[DongLiORM.BusinessAtrribute("Groups",new string[]{"GroupID"},typeof(GroupItem))]
[DongLiORM.ChildFieldAtrribute("BelongUsers", //属性的名字
typeof(UserGroupItem) //该属性的业务实体类
)
] //1-N就在这里
public class GroupItem:DongLiORM.BusinessObject
{
public GroupItem()
{
}
public string GroupID
{
get
{
return _GroupID;
}
set
{
_GroupID = value;
}
}
private string _GroupID="";
public string GroupName
{
get
{
return _GroupName;
}
set
{
_GroupName = value;
}
}
private string _GroupName = "";
public UserGroupItem[] BelongUsers
{
get
{
return (UserGroupItem[])_BelongUsers.ToArray(typeof(UserGroupItem));
}
set
{
_BelongUsers.Clear();
_BelongUsers.AddRange(value);
}
}
ArrayList _BelongUsers = new ArrayList();
public void AddUsers(object[] UserGroups)
{
_BelongUsers.AddRange(UserGroups);
}
}
[DongLiORM.BusinessAtrribute("UserGroups",new string[]{"UserID","GroupID"},typeof(UserGroupItem))]
public class UserGroupItem:DongLiORM.BusinessObject
{
public UserGroupItem()
{ }
public string UserID
{
get
{
return _UserID;
}
set
{
_UserID = value;
}
}
private string _UserID = "";
public string GroupID
{
get
{
return _GroupID;
}
set
{
_GroupID = value;
}
}
private string _GroupID = "";
}
}
using System.Collections;
using System.Text;
namespace BUL.Security
{
[DongLiORM.BusinessAtrribute("Groups",new string[]{"GroupID"},typeof(GroupItem))]
[DongLiORM.ChildFieldAtrribute("BelongUsers", //属性的名字
typeof(UserGroupItem) //该属性的业务实体类
)
] //1-N就在这里
public class GroupItem:DongLiORM.BusinessObject
{
public GroupItem()
{
}
public string GroupID
{
get
{
return _GroupID;
}
set
{
_GroupID = value;
}
}
private string _GroupID="";
public string GroupName
{
get
{
return _GroupName;
}
set
{
_GroupName = value;
}
}
private string _GroupName = "";
public UserGroupItem[] BelongUsers
{
get
{
return (UserGroupItem[])_BelongUsers.ToArray(typeof(UserGroupItem));
}
set
{
_BelongUsers.Clear();
_BelongUsers.AddRange(value);
}
}
ArrayList _BelongUsers = new ArrayList();
public void AddUsers(object[] UserGroups)
{
_BelongUsers.AddRange(UserGroups);
}
}
[DongLiORM.BusinessAtrribute("UserGroups",new string[]{"UserID","GroupID"},typeof(UserGroupItem))]
public class UserGroupItem:DongLiORM.BusinessObject
{
public UserGroupItem()
{ }
public string UserID
{
get
{
return _UserID;
}
set
{
_UserID = value;
}
}
private string _UserID = "";
public string GroupID
{
get
{
return _GroupID;
}
set
{
_GroupID = value;
}
}
private string _GroupID = "";
}
}
3、调用示例
1)新增
UserItem AUser
=
new
UserItem();
AUser.UserID = " C054965 " ;
AUser.Pwd = " C054965 " ;
AUser.UserName = " 刘永红 " ;
AUser.Email = " yahongq111@163.com " ;
DongLiORM.BusinessAtrribute Attr = Common.Tools.CommonTool.GetBusinessAtrr( typeof (BUL.Security.UserItem));
Attr.Writer.Insert(AUser);
AUser.UserID = " C054965 " ;
AUser.Pwd = " C054965 " ;
AUser.UserName = " 刘永红 " ;
AUser.Email = " yahongq111@163.com " ;
DongLiORM.BusinessAtrribute Attr = Common.Tools.CommonTool.GetBusinessAtrr( typeof (BUL.Security.UserItem));
Attr.Writer.Insert(AUser);
2) 查询
DongLiORM.BusinessAtrribute Attr
=
Common.Tools.CommonTool.GetBusinessAtrr(
typeof
(BUL.Security.UserItem));
UserItem[] Users = (UserItem[]) Attr.Reader.GetDataByCondition( " UserID like @UserID " ,
new SqlParameter[] {new SqlParamter("@UserID","C054965%")}
/*
或者
"UserID like 'C054965%'
*/
);
foreach (UserItem User in Users)
{
Console.Write("{0}/t{1}/t{2}/n",User.UserID,User.UserName,User.Email);
//
//也可以这样写
//Console.Write("{0}/t{1}/t{2}/n",User["UserID"],User["UserName"],User["Email"]);
//
}
/*
Top N 示例
*/
Users = (UserItem[]) Attr.Reader.GetTopDataByCondition( " UserID like @UserID " ,
new SqlParameter[] {new SqlParamter("@UserID","C054965%")} ,
5
);
foreach (UserItem User in Users)
{
Console.Write("{0}/t{1}/t{2}/n",User.UserID,User.UserName,User.Email);
}
UserItem[] Users = (UserItem[]) Attr.Reader.GetDataByCondition( " UserID like @UserID " ,
new SqlParameter[] {new SqlParamter("@UserID","C054965%")}
/*
或者
"UserID like 'C054965%'
*/
);
foreach (UserItem User in Users)
{
Console.Write("{0}/t{1}/t{2}/n",User.UserID,User.UserName,User.Email);
//
//也可以这样写
//Console.Write("{0}/t{1}/t{2}/n",User["UserID"],User["UserName"],User["Email"]);
//
}
/*
Top N 示例
*/
Users = (UserItem[]) Attr.Reader.GetTopDataByCondition( " UserID like @UserID " ,
new SqlParameter[] {new SqlParamter("@UserID","C054965%")} ,
5
);
foreach (UserItem User in Users)
{
Console.Write("{0}/t{1}/t{2}/n",User.UserID,User.UserName,User.Email);
}
3)修改,假设修改前面的AUser
UserItem NewUser
=
AUser.NarrowClone();
NewUser.UserName = " 刘永红修改测试 " ;
NewUser.OldObject = AUser;
Attr.Writer.Update(NewUser);
4)删除
NewUser.UserName = " 刘永红修改测试 " ;
NewUser.OldObject = AUser;
Attr.Writer.Update(NewUser);
Attr.Writer.Delete(NewUser);
备注:
1)关于级联查询、DML:
在1-N关系中,如果调用GetDataByCondition,会把所有相关的N层属性全部填充,如果只想查询本身, 则可以用GetSelfDataByCondition,对于删除操作,如果删除上级,则下级会跟着删除。对于Update,则不会跟着更改下级的外键,需自己手动更改。对于新增操作,会将所有的上级和下级数据全部存入数据库。
2)关于事务处理:
系统没有提供默认的事务支持功能,不过调用的时候可以用一下语句:
using
(System.Transactions.TransactionScope scope
=
new
System.Transactions.TransactionScope())
{
//
//系统操作
//
scope.Complete(); //这样就有了事务支持了,不过要记得在DCOM里面配置哦。
}
3)关于性能:
{
//
//系统操作
//
scope.Complete(); //这样就有了事务支持了,不过要记得在DCOM里面配置哦。
}
大量运用反射,没有做过严格的测试(所以性能应该不会很高)。这方面还有大量可以优化的地方(至少还可以用到缓存,但目前我还没有这样做)。
4)关于版权:
既然说了开源,当然可以自由传播,修改,可以不加任何限制做商业用途,前提是保留第一版作者在源代码中的 版权描述,如果我将来有幸可以开公司,那么你不能跟我打这方面的官司:说这是你注册了的,有版权/专利权的产 品,我必须赔偿你的损失等等。
DongLiORM 源码
这是我的第一个公开作品,欢迎大家拍砖。
刘永红< Yahongq111@163.com>
2007-06-06