做.Net ORM框架和工具。基于.Net2.0或以上版本的ORM,请大家给点意见

anzhiqiang_touzi 2012-04-01 10:05:53
本人想做一个.Net ORM框架和工具。
开发背景:
1.现在很多大公司还采用.Net2.0环境,不支持Linq O/M
2.优秀框架NH+Spring.Net配置过于复杂,无代码工具
3.其他的框架支持得不够好,而且使用了大量的反射机制。
4.部分开源框架不支持ORM表达式。

开发目的:
1.集成开源框架的优点,快速开发。提高开发效率,系统性能。
2.组建个人工作室和开发团队。提高个人资质。发布开源网站。
3.承接系统开发。

我想要的ORM功能:
1.支持.Net2.0或以上版本。
2.支持Orcle,SqlServer,Access,MySql。其他的以后再考虑。
3.不使用反射机制,或者少用反射。
4.支持基本查询,删除,更新,表达式,通用分页查询,分组查询,部分函数。
5.少量配置文件的支持(仅仅支持配置SQL语句。也就是Ibeatis的支持)。
6.支持事物管理。分为:数据库事物,分布式事物(不需要任何配置)。
7.支持多数据库的分布式。
8.系统操作日志的统一处理。(异步日志)。
9.ORM工具。


说明:以上功能基本上已经有已个雏形了。想目前是基于SQLServer来做的。
已经实现如下功能:
支持基本查询,删除,更新,表达式,通用分页查询,分组查询,部分函数。
支持数据库事物,分布式事物,分布式数据库。
支持SQLServer数据库。
支持异步统一日志管理
本人慎重申明:此贴并非广告。
但是想大家给点参考意见。说说框架能否给我的团队或个人带来经济效益或资质效益。
今晚上准备贴点代码上来。
...全文
627 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluedoctor 2012-10-15
  • 打赏
  • 举报
回复
楼主做ORM的场景跟我基本上差不多阿,不过我没有考虑过商业化的问题,已经开源了,它就是PDF.NET开发框架
anzhiqiang_touzi 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]
楼主,我看了一下,
第一:你字符串太多了,会点会大量的资料,
第二:你数据返回的是table如何orm呀?对象-关系映射的思想怎么体现呀?
第三:无语中……
[/Quote]

2.0的orm
你想怎么搞,难道你想像linq 这个来映射。
来可以返回list的集合啊
只是这个方法没写上来

你觉得orm就必须全部用实体吗,
如果全部用实体的话,就算是linq也搞不定的,比如行转列后的实体是怎么写呢?
而且:nhibernate在2.0的时候也是返回打他table吧
anzhiqiang_touzi 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]
楼主,我看了一下,
第一:你字符串太多了,会点会大量的资料,
第二:你数据返回的是table如何orm呀?对象-关系映射的思想怎么体现呀?
第三:无语中……
[/Quote]

2.0的orm
你想怎么搞,难道你想像linq 这个来映射。
来可以返回list的集合啊
只是这个方法没写上来

gs0038 2012-05-05
  • 打赏
  • 举报
回复
楼主,我看了一下,
第一:你字符串太多了,会点会大量的资料,
第二:你数据返回的是table如何orm呀?对象-关系映射的思想怎么体现呀?
第三:无语中……
anzhiqiang_touzi 2012-04-09
  • 打赏
  • 举报
回复
业务逻辑

/// <summary>
/// ORM业务逻辑测试
/// </summary>
public class TestBLL : BaseBLL
{
/// <summary>
/// 访问数据库A的Common_LogLoginDao表
/// </summary>
public Common_LogLoginDao1 Common_LogLoginDao1 { get; set; }

/// <summary>
/// 访问数据库B的Common_LogLoginDao表
/// </summary>
public Common_LogLoginDao2 Common_LogLoginDao2 { get; set; }

/// <summary>
/// 访问数据库A的UserInfo表
/// </summary>
public UserInfoDao UserInfoDao { get; set; }

/// <summary>
/// 查询测试
/// </summary>
[BusinessMethod(AopTransactionScopeOption.None, AopLogOption.Required, "查询测试")]
public void TestQuery()
{
Common_LogLoginMap map1 = Common_LogLoginDao1.EntityMaping;
UserInfoMap map2 = UserInfoDao.EntityMaping;

//含有Where表达式的普通查询
DataTable dt2 = UserInfoDao.
Query(map2).
Where(map2.UserID == 10000 | map2.UserID == map2.UserID).
Select(map2.UserID, map2.UserAccount, map2.CreateDate, map2.EffectiveTime).
OrderByDesc(map2.UserID).ToList();

int Count = 0;
//含有Where表达式的分页查询
DataTable dt3 = UserInfoDao.
Query(map1, map2).
Where(map1.LoginAccount == map2.UserAccount & map1.ID >= 2200).
Select(map1.ID, map2.UserID, map2.UserAccount, map2.CreateDate, map2.EffectiveTime).
OrderByAsc(map2.UserID).ToList(10, 1, out Count);

//含有Where表达式的分页查询
int Count1 = 0;
DataTable dt4 = UserInfoDao.
Query(map1).
Select(map1.ID, map1.LoginTime, map1.LoginIP, map1.LoginAccount, map1.IsSuccess).
OrderByAsc(map1.ID).ToList(10, 1, out Count1);
}

/// <summary>
/// 分页测试
/// </summary>
[BusinessMethod(AopTransactionScopeOption.DataBase, AopLogOption.Required, "分页测试")]
public object TestPage(int pageSize, int pageIndex, int ID, out int Count)
{
Common_LogLoginMap map1 = Common_LogLoginDao1.EntityMaping;
UserInfoMap map2 = UserInfoDao.EntityMaping;

List<Common_LogLogin> list = Common_LogLoginDao1.GetList(map1.ID > 0);
//分页查询
DataTable dt3 = UserInfoDao.
Query(map1, map2).
Where(map1.LoginAccount == map2.UserAccount & map1.ID >= ID).
Select(map1.ID, map2.UserID, map2.UserAccount, map2.CreateDate, map2.EffectiveTime).
OrderByAsc(map1.ID).OrderByAsc(map2.UserID).ToList(pageSize, pageIndex, out Count);
//分组查询
DataTable dtGroupBy = UserInfoDao.
Query(map1, map2).
Where(map1.LoginAccount == map2.UserAccount).
Select(map1.ID.Avg(), map1.LoginAccount.Count(), map1.LoginIP).
GroupBy(map1.LoginIP).ToList();

Common_LogLoginDao1.Delete(map1.ID > 0);
return dt3;
}

/// <summary>
/// 分布式事物测试
/// </summary>
[BusinessMethod(AopTransactionScopeOption.Distributed, AopLogOption.Required, "分布式事物测试")]
public bool TestTransaction()
{
Common_LogLogin model = new Common_LogLogin();
model.LoginAccount = "LoginAccount";
model.IsSuccess = true;
model.LoginIP = "LoginIP";
model.LoginTime = DateTime.Now;
model.Remark = "Remark";

//插入数据库A
Common_LogLoginDao1.Add(model);//成功
model.LoginIP = "LoginIPLP";
//插入数据库B
Common_LogLoginDao2.Add(model);//失败
return true;
}
}
anzhiqiang_touzi 2012-04-09
  • 打赏
  • 举报
回复
数据访问

//Base
/// <summary>
/// 数据库A的数据访问类
/// </summary>
public class BaseDao1<Entity, EntityMap> : TemplateDao<Entity, EntityMap>
where Entity : class
where EntityMap : class
{
/// <summary>
/// 获取连接字符串
/// </summary>
public override string ConnectionStringKey
{
get { return "ConnectionString1"; }
}
}

/// <summary>
/// 数据库B的数据访问类
/// </summary>
public class BaseDao2<Entity, EntityMap> : TemplateDao<Entity, EntityMap>
where Entity : class
where EntityMap : class
{
/// <summary>
/// 获取连接字符串
/// </summary>
public override string ConnectionStringKey
{
get { return "ConnectionString2"; }
}
}



/// <summary>
/// 访问数据库A的Common_LogLoginDao表
/// </summary>
public class Common_LogLoginDao1 : BaseDao1<Common_LogLogin, Common_LogLoginMap>
{

}

/// <summary>
/// 访问数据库B的Common_LogLoginDao表
/// </summary>
public class Common_LogLoginDao2 : BaseDao2<Common_LogLogin, Common_LogLoginMap>
{

}
anzhiqiang_touzi 2012-04-09
  • 打赏
  • 举报
回复
这几天终于做出了点点成绩了
我的ORM

实体

/// <summary>
/// 实体对象
/// </summary>
public class Common_LogLogin : BaseEntity
{
/// <summary>
/// 编号
/// </summary>
public int ID
{
get { return (int)this["ID"]; }
set { this["ID"] = value; }
}
/// <summary>
/// 登录帐号
/// </summary>
public string LoginAccount
{
get { return (string)this["LoginAccount"]; }
set { this["LoginAccount"] = value; }
}
/// <summary>
/// 登录时间
/// </summary>
public Nullable<DateTime> LoginTime
{
get { return (Nullable<DateTime>)this["LoginTime"]; }
set { this["LoginTime"] = value; }
}
/// <summary>
/// 登录IP
/// </summary>
public string LoginIP
{
get { return (string)this["LoginIP"]; }
set { this["LoginIP"] = value; }
}
/// <summary>
/// 是否登录成功
/// </summary>
public Nullable<bool> IsSuccess
{
get { return (Nullable<bool>)this["IsSuccess"]; }
set { this["IsSuccess"] = value; }
}
/// <summary>
/// 备注
/// </summary>
public string Remark
{
get { return (string)this["Remark"]; }
set { this["Remark"] = value; }
}
}


/// <summary>
/// 实体映射
/// </summary>
public class Common_LogLoginMap : BaseEntityMap
{
public Common_LogLoginMap()
{
//表名
this.TableName = "Common_LogLogin";
//字段属性
this.AddProperty("ID", default(Int16), 100, DbType.Int16, true, true, AutoSync.OnInsert);
this.AddProperty("LoginAccount", default(string), 100, DbType.String, false, false, AutoSync.Default);
this.AddProperty("LoginTime", default(DateTime), 100, DbType.DateTime, false, false, AutoSync.Default);
this.AddProperty("LoginIP", default(string), 100, DbType.String, false, false, AutoSync.Default);
this.AddProperty("IsSuccess", default(bool), 100, DbType.Boolean, false, false, AutoSync.Default);
this.AddProperty("Remark", default(string), 100, DbType.String, false, false, AutoSync.Default);
}
/// <summary>
/// 登录帐号
/// </summary>
public Expression LoginAccount { get { return this["LoginAccount"]; } }
/// <summary>
/// 登录时间
/// </summary>
public Expression LoginTime { get { return this["LoginTime"]; } }
/// <summary>
/// 登录IP
/// </summary>
public Expression LoginIP { get { return this["LoginIP"]; } }
/// <summary>
/// 是否登录成功
/// </summary>
public Expression IsSuccess { get { return this["IsSuccess"]; } }
/// <summary>
/// 编号
/// </summary>
public Expression ID { get { return this["ID"]; } }
/// <summary>
/// 备注信息
/// </summary>
public Expression Remark { get { return this["Remark"]; } }
}
anzhiqiang_touzi 2012-04-05
  • 打赏
  • 举报
回复
没有高手给在下点意见吗?
gongjie416 2012-04-05
  • 打赏
  • 举报
回复
期待楼主作品
anzhiqiang_touzi 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
做 ORM 还有不用反射的么?
[/Quote]
是少量反射,至少实体的数据存取不要用反射
焚寂 2012-04-05
  • 打赏
  • 举报
回复
做 ORM 还有不用反射的么?
xuan.ye 2012-04-05
  • 打赏
  • 举报
回复
搞这个东西,起码要熟读几边 .net castle

不知道读完之后,你还会不会想了

SomethingJack 2012-04-05
  • 打赏
  • 举报
回复
期待楼主的作品。 话说我们现在框架是架构师搞的- -
IT-Style 2012-04-05
  • 打赏
  • 举报
回复
商业化路途比较艰难!...
贝贝壳壳 2012-04-01
  • 打赏
  • 举报
回复
赞同4楼说的

除非是像微软,Oracle之类的大公司,即使不开源,大家也会放心用

大家要么自己写,要么用开源的,不会用轻易用其它不知名的第三方

安全性,可靠性都很成问题。
贝贝壳壳 2012-04-01
  • 打赏
  • 举报
回复
自己公司用用还行,想商业化,很困难。
cheng2005 2012-04-01
  • 打赏
  • 举报
回复
这么说吧,一般很少有企业会使用第三方的 数据访问层 ,有实力的公司会自己做,没实力的公司会选用开源框架。
反正不管怎么说,极少会有企业把这种关键的东西用黑盒来弄,一定需要掌握源码才行,不然之后的维护升级麻烦多多。
这毕竟不是一个模块,或者一个功能,而是一个公用的 数据访问层 ,之后的开发都需要依赖这个东西,如果没有源码的话基本不会有人敢用的。

当然,楼主你可以把源码也给出去,但是我觉得如果源码给出去的话...经济效益可就没什么了。
踏雪听雨 2012-04-01
  • 打赏
  • 举报
回复
感觉楼主过于理想,要不然NH也都能实现这些功能了
yuzan0123 2012-04-01
  • 打赏
  • 举报
回复
期待楼主的作品········
虽说经济效益不是很大,但对于你们团队的开发应该蛮有用的
anzhiqiang_touzi 2012-04-01
  • 打赏
  • 举报
回复
不是100%摆脱SQL语句,至少可以解决80%的SQL语句
一个系统讲:至少80%的SQL都是很简单的
加载更多回复(5)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧