当前位置:编程学习 > C#/ASP.NET >>

逻辑三层ORM通用类库 ThreeLayerLib.dll v1.0

逻辑三层ORM通用类库 ThreeLayerLib.dll v1.0
作者:wxl

本类库的目标用户是使用C#开发基于数据库的.NET程序的开发者,旨在简化对常用数据库的CRUD操作,同时提供了一种简化的ORM机制,使基于本类库开发的程序具有更好的可扩展性和可维护性。
本类库默认SQLServer数据库,但并不受数据库类型的限制,开发者可以使用任何自己需要的关系数据库,如 SQLServer、Access、MySQL等。
使用方法:
目前版本需用户自己定义数据库表格的相应实体类,下一版本中作者将实现自动化。实体类应具有【TableAttribute】特性,以标识数据库表名。默认SQLServer数据库,如果用户需要扩展其他类型数据库,则需要自己做一个类库项目,且包含如下两个类:
1、能够实现IDAL的类
2、能够实现IDbHelper的类

举例:

[TableAttribute("t_Email")]
public class Model_t_Email
{
protected int _Email_ID;

public int Email_ID
{
get { return _Email_ID; }
set { _Email_ID = value;}
}
protected string _Email_Title;

public string Email_Title
{
get { return _Email_Title; }
set { _Email_Title = value; }
}
protected string _Email_SendTo;

public string Email_SendTo
{
get { return _Email_SendTo; }
set { _Email_SendTo = value; }
}
protected string _Email_From;

public string Email_From
{
get { return _Email_From; }
set { _Email_From = value; }
}
protected string _Email_Content;

public string Email_Content
{
get { return _Email_Content; }
set { _Email_Content = value; }
}
protected string _Email_Attatchment;

public string Email_Attatchment
{
get { return _Email_Attatchment; }
set { _Email_Attatchment = value; }
}
protected string _Email_Time;

public string Email_Time
{
get { return _Email_Time; }
set { _Email_Time = value; }
}
protected string _Email_IsReadAlready;

public string Email_IsReadAlready
{
get { return _Email_IsReadAlready; }
set { _Email_IsReadAlready = value; }
}

}


private string constr = "server=192.168.143.18;database=D16;uid=sa;pwd=123456";
BLL<Model_t_Email> bll = new BLL<Model_t_Email>(constr);

//如果要使用其他非SQLServer数据库,请用户自己做一个类库,假设叫AccessHelper.dll,且包含如下两个类:
//1、能够实现IDAL的类
//2、能够实现IDbHelper的类
//BLL<Model_t_Email> bll = new BLL<Model_t_Email>(constr, Application.StartupPath + @"\AccessHelper.dll");

Model_t_Email model = new Model_t_Email();
model.Email_ID = bll.GetMaxID() + 1;
model.Email_Title = "Fu";
bll.Add(model);
List<Model_t_Email> list = bll.GetListModel();
--------------------编程问答-------------------- 在C# 3.0以及以上,代码可以简化:
        protected int _Email_ID;

        public int Email_ID
        {
            get { return _Email_ID; }
            set { _Email_ID = value;}
        }
=>
        public int Email_ID { get; set; }
其他类似 --------------------编程问答-------------------- 嗯,FrameWork 3.0以上确实可以简化,谢谢大神指点! --------------------编程问答-------------------- 好东西,,,收获大了。。。 --------------------编程问答-------------------- 好东西 希望继续完善强大! --------------------编程问答-------------------- 围观,支持.. --------------------编程问答-------------------- 不知道CSDN怎么上传附件,哪位大神指点一下?我把附件传上去,请大家批评指正,多提宝贵意见,谢谢! --------------------编程问答-------------------- 很好 的 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用 6 楼  的回复:
不知道CSDN怎么上传附件,哪位大神指点一下?我把附件传上去,请大家批评指正,多提宝贵意见,谢谢!


传到资源下载。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- 1.model.Email_ID = bll.GetMaxID() + 1;

多人并发这个不靠谱,我们依赖事实而不是依赖假定

2.如今IDbHelper已经可以抛弃了,如今手段太多,工厂类这种东西在net3.0以上版本的开发中基本都快绝迹了 --------------------编程问答-------------------- 论坛最顶部有资源链接进去就可以了。 --------------------编程问答-------------------- 1.model.Email_ID = bll.GetMaxID() + 1;
===
这个一般我更喜欢将主键ID 在数据库中设置为自增 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- Model_t_Email model = new Model_t_Email();
    model.Email_ID = bll.GetMaxID() + 1;
    model.Email_Title = "Fu";
一般我的系统根据需求:用主键编号
可能是字符串呢
也可以是guid
也可以是自增id [这个一般我不这样用,数据迁移是个大问题]
但是要考虑字符串的主键和联合主键 --------------------编程问答-------------------- --------------------编程问答-------------------- 不大清楚C#的编程,为什么不用java webb编写呢? --------------------编程问答-------------------- 多谢了,认真研究一下 --------------------编程问答-------------------- ???
么看懂?啥意思啊??
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 1 楼  的回复:
在C# 3.0以及以上,代码可以简化:
  protected int _Email_ID;

  public int Email_ID
  {
  get { return _Email_ID; }
  set { _Email_ID = value;}
  }
=>
  public int Email_ID { get; set; }
其他类似

绝对可以简化:
public int Email_ID { get; set; }
--------------------编程问答-------------------- --------------------编程问答--------------------
引用 13 楼  的回复:
1.model.Email_ID = bll.GetMaxID() + 1;

多人并发这个不靠谱,我们依赖事实而不是依赖假定

2.如今IDbHelper已经可以抛弃了,如今手段太多,工厂类这种东西在net3.0以上版本的开发中基本都快绝迹了


1、小弟也是初学,请教大神指点一下如何依赖事实确定实体类的主键ID呢?谢谢!
2、请大神讲解一下能代替工厂类的其他方法,小弟不胜感激,再次感谢! --------------------编程问答--------------------
引用 20 楼  的回复:
不大清楚C#的编程,为什么不用java webb编写呢?


当然可以用java写,本文只是提供了一个C#的实现。其实.NET在很大程度上是借鉴了java的思想,包括抛弃指针、好多框架也是借鉴java的框架。另外小弟也是初学者,请大神指教,谢谢! --------------------编程问答-------------------- 附件已经上传至资源,请大家测试,多多指点不足,谢谢! --------------------编程问答-------------------- 谢谢大侠分享 --------------------编程问答--------------------
引用 26 楼  的回复:
小弟也是初学,请教大神指点一下如何依赖事实确定实体类的主键ID呢?谢谢!


没有看你的代码,不评论其它问题。单就#13楼所说的“并发”而言,这个代码大致应该修改为这样:

首先你需要在class范畴定义变量
private static object IDLockFlag= new object();

然后将计算ID过程编程管理程序(只允许单线程)例如
long newID;
lock(IDLockFlag)
{
    newID= bll.GetMaxID() + 1;
    bll.SetMaxID(newID);
}
model.Email_ID = newID;


假设你使用一个表专门记录每一类对象的MaxID,而你对此表的读写又要分开在.net中编程(而不是在一个DBTransaction中),那么就需要保证在过程中对此读数的读和写两个操作之间的完整过程(也就是这两行代码而已)是线程互斥的。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 27 楼  的回复:
引用 20 楼  的回复:
不大清楚C#的编程,为什么不用java webb编写呢?


当然可以用java写,本文只是提供了一个C#的实现。其实.NET在很大程度上是借鉴了java的思想,包括抛弃指针、好多框架也是借鉴java的框架。另外小弟也是初学者,请大神指教,谢谢!


哥笑了,C#并未抛弃指针,C#一样可以使用指针,而且3层架构以及ORM本身并非借鉴JAVA的思想! --------------------编程问答-------------------- 谢谢楼主分享,学习! --------------------编程问答-------------------- --------------------编程问答--------------------
引用 30 楼  的回复:
引用 26 楼  的回复:
小弟也是初学,请教大神指点一下如何依赖事实确定实体类的主键ID呢?谢谢!


没有看你的代码,不评论其它问题。单就#13楼所说的“并发”而言,这个代码大致应该修改为这样:

首先你需要在class范畴定义变量C# code
private static object IDLockFlag= new object();

然后将计算ID过程编程管理程序(……


lock本身也是有问题的。多进程也不行 --------------------编程问答--------------------
引用 30 楼  的回复:
引用 26 楼 的回复:
小弟也是初学,请教大神指点一下如何依赖事实确定实体类的主键ID呢?谢谢!


没有看你的代码,不评论其它问题。单就#13楼所说的“并发”而言,这个代码大致应该修改为这样:

首先你需要在class范畴定义变量

C# code
private static object IDLockFlag= new object();

然后将计算ID过程编程管理……


sp1234大神如雷贯耳,呵呵,对问题指点的很是深刻。小弟从来没有考虑过线程互斥以及多并发的情况,以后要向大哥多请教!谢谢! --------------------编程问答--------------------
引用 32 楼  的回复:
引用 27 楼 的回复:

引用 20 楼 的回复:
不大清楚C#的编程,为什么不用java webb编写呢?


当然可以用java写,本文只是提供了一个C#的实现。其实.NET在很大程度上是借鉴了java的思想,包括抛弃指针、好多框架也是借鉴java的框架。另外小弟也是初学者,请大神指教,谢谢!


哥笑了,C#并未抛弃指针,C#一样可以使用指针,而且3层架构以及ORM本身并……


C#确实可以unsafe使用指针,但本人很排斥C#的指针操作,曾经一度差点放弃C#,拾起C++的老本行,呵呵! --------------------编程问答-------------------- ThreeLayerLib源代码已经上传至资源,请各位大神莅临指导! --------------------编程问答-------------------- 你可以研究一下CSLA.NET框架,很不错的!

另外大名鼎鼎的NHibernate也挺棒! --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- http://ota.hubs1.net/down/webdemo-1.101.rar
这里有一套源码例子,不知道是否切题。 --------------------编程问答-------------------- 不错,支持哈 --------------------编程问答-------------------- 精神要支持。。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 39 楼  的回复:
你可以研究一下CSLA.NET框架,很不错的!

另外大名鼎鼎的NHibernate也挺棒!


在下也粗浅的研究过CSLA.NET,人家的东西太牛了,很专业的架构,至今在下也没有完全弄懂,正在研究中......
NHibernate好像被Spring.NET给包含了,不知道为什么。 --------------------编程问答-------------------- 谢谢大家顶贴,请多多指点不足,谢谢! --------------------编程问答-------------------- 谢谢    指点 --------------------编程问答-------------------- 楼主牛人,先膜拜

有没有将外键关系映射为对象关联的代码,贴上来看看 --------------------编程问答--------------------
引用 50 楼 theillusion 的回复:
楼主牛人,先膜拜

有没有将外键关系映射为对象关联的代码,贴上来看看


目前还没有考虑外键映射,下一步将把外键加进去,再次感谢您提的宝贵意见,谢谢! --------------------编程问答--------------------
引用 50 楼  的回复:
楼主牛人,先膜拜

有没有将外键关系映射为对象关联的代码,贴上来看看


目前还没有考虑外键映射,下一步会加进来,再次感谢您的宝贵意见,谢谢! --------------------编程问答--------------------
引用 1 楼  的回复:
在C# 3.0以及以上,代码可以简化:
        protected int _Email_ID;

        public int Email_ID
        {
            get { return _Email_ID; }
            set { _Email_ID = value;}
        }
=>
        p……


大家注意:并不是在3.0里增加的,而是在vs2008里增加的自动属性.
详见vs2008新增功能. 而非.net3.0新增功能.

在vs2008里开发,.net使用2.0也可以使用自动属性
//如果只让自己或者子类赋值则可以定义为:
 public int Count { get; protected set; }
--------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 呵呵,,都已经这样了,public int Email_ID { get; set; }

何不这么麻烦??

改成  public int Email_ID; 岂不是更好???

想加其他操作的的时候再去把公共变量 改为 公共属性 就是; --------------------编程问答-------------------- 好像跑题了,呵呵,请各位多谈谈关系数据库和面向对象的结合问题,如果不采用ORM,有没有更好的解决方案?还有数据库多人并发的访问控制。 --------------------编程问答-------------------- LZ各种威武啊!膜拜之······ --------------------编程问答-------------------- 我的这个类库中,所谓的BLL其实并不是真正的业务逻辑层,只是大家所说的“传声筒”而已,如果需要可以自己写真正的适合具体应用的逻辑。 --------------------编程问答-------------------- 下步打算:
1、实体类自动生成器(现在正在做,基本没有难度)。
2、改进数据访问层的SQL查询
3、。。。。。。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,