逻辑三层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();

解决方案 »

  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; }
    其他类似
      

  2.   

    嗯,FrameWork 3.0以上确实可以简化,谢谢大神指点!
      

  3.   

    不知道CSDN怎么上传附件,哪位大神指点一下?我把附件传上去,请大家批评指正,多提宝贵意见,谢谢!
      

  4.   

    1.model.Email_ID = bll.GetMaxID() + 1;多人并发这个不靠谱,我们依赖事实而不是依赖假定2.如今IDbHelper已经可以抛弃了,如今手段太多,工厂类这种东西在net3.0以上版本的开发中基本都快绝迹了
      

  5.   

    1.model.Email_ID = bll.GetMaxID() + 1;
    ===
    这个一般我更喜欢将主键ID 在数据库中设置为自增
      

  6.   

    Model_t_Email model = new Model_t_Email();
        model.Email_ID = bll.GetMaxID() + 1;
        model.Email_Title = "Fu";
    一般我的系统根据需求:用主键编号
    可能是字符串呢
    也可以是guid
    也可以是自增id [这个一般我不这样用,数据迁移是个大问题]
    但是要考虑字符串的主键和联合主键
      

  7.   

    不大清楚C#的编程,为什么不用java webb编写呢?
      

  8.   

    绝对可以简化:
    public int Email_ID { get; set; }
      

  9.   


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

  10.   


    没有看你的代码,不评论其它问题。单就#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中),那么就需要保证在过程中对此读数的读和写两个操作之间的完整过程(也就是这两行代码而已)是线程互斥的。
      

  11.   


    哥笑了,C#并未抛弃指针,C#一样可以使用指针,而且3层架构以及ORM本身并非借鉴JAVA的思想!
      

  12.   


    lock本身也是有问题的。多进程也不行
      

  13.   


    C#确实可以unsafe使用指针,但本人很排斥C#的指针操作,曾经一度差点放弃C#,拾起C++的老本行,呵呵!
      

  14.   

    ThreeLayerLib源代码已经上传至资源,请各位大神莅临指导!
      

  15.   

    你可以研究一下CSLA.NET框架,很不错的!另外大名鼎鼎的NHibernate也挺棒!
      

  16.   

    http://ota.hubs1.net/down/webdemo-1.101.rar
    这里有一套源码例子,不知道是否切题。
      

  17.   


    在下也粗浅的研究过CSLA.NET,人家的东西太牛了,很专业的架构,至今在下也没有完全弄懂,正在研究中......
    NHibernate好像被Spring.NET给包含了,不知道为什么。
      

  18.   


    大家注意:并不是在3.0里增加的,而是在vs2008里增加的自动属性.
    详见vs2008新增功能. 而非.net3.0新增功能.在vs2008里开发,.net使用2.0也可以使用自动属性
    //如果只让自己或者子类赋值则可以定义为:
     public int Count { get; protected set; }
      

  19.   

    呵呵,,都已经这样了,public int Email_ID { get; set; }何不这么麻烦??改成  public int Email_ID; 岂不是更好???想加其他操作的的时候再去把公共变量 改为 公共属性 就是;
      

  20.   

    好像跑题了,呵呵,请各位多谈谈关系数据库和面向对象的结合问题,如果不采用ORM,有没有更好的解决方案?还有数据库多人并发的访问控制。
      

  21.   

    我的这个类库中,所谓的BLL其实并不是真正的业务逻辑层,只是大家所说的“传声筒”而已,如果需要可以自己写真正的适合具体应用的逻辑。
      

  22.   

    下步打算:
    1、实体类自动生成器(现在正在做,基本没有难度)。
    2、改进数据访问层的SQL查询
    3、