C# 自定义ORM 以及 通过委托实现事务(第一版)

时间:2022-06-07 03:13:55

本demo是个人偶尔头脑发热,想要实现的一个ORM,用于在多层结构下,实现数据库的操作,包括多表事务操作。

具体请查看源码。下载源码

结构图片: 

C# 自定义ORM 以及 通过委托实现事务(第一版)

包括 数据持久结构,业务处理结构,界面结构。

业务实体类与数据模型的区别在于,数据模型不存在依赖的模型,但是业务实体类中存在依赖的实体。比如:DB.Entity中的Student学生类只有ClassID ,但是Ligic.Entity中的Student类却拥有Class 作为一个属性。

数据库事务操作委托类:

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using DB.Util;

namespace DB.BIZ
{
    class DBDelegate<T>
    {
        public delegate T OpenTranscation(TsqlCommand tsql, SqlConnection conn, SqlTransaction tran);


        public T Open(string strConn, TsqlCommand tsql, OpenTranscation action)
        {
            T t = default(T);
            using (SqlConnection conn = new SqlConnection(strConn))
            {
                conn.Open();
                SqlTransaction tran = conn.BeginTransaction();//开启一个事物

                try
                {

                    t = action(tsql, conn, tran);

                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    throw ex;
                }
                finally
                {
                    tran.Dispose();
                    conn.Close();
                }
            }
            return t;
        }

    }
}

DB.DAO中的持久方法,仅返回操作TSQL以及查询参数。DB.BIZ中通过事务,进行持久化。

数据持久业务类,是真正的与数据库的操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using DB.Entity;
using DB.Util;
using DB.ORM;




namespace DB.DAO
{

    public class StudentDAO : IEntity<Student>
    {

        public TsqlCommand Insert(Student entity)
        {
            TsqlCommand sql = ModelReflection<Student>.Insert(entity);
            return sql;
        }

        public TsqlCommand Update(Student entity)
        {
            TsqlCommand sql = ModelReflection<Student>.Update(entity);
            return sql;
        }

        public TsqlCommand Delete(object ID)
        {
            TsqlCommand sql = ModelReflection<Student>.Delete(ID);
            return sql;
        }

        public TsqlCommand GetByID(object ID)
        {
            TsqlCommand sql = ModelReflection<Student>.Select();

            TsqlParameter pa = new TsqlParameter()
            {
                PiName = "ID",
                Value = ID,
                Condition = CompareCondition.EqualTo
            };
            ModelReflection<Student>.CreateParameter(sql, pa);

            return sql;
        }

        public TsqlCommand GetList()
        {
            TsqlCommand sql = ModelReflection<Student>.Select();
            return sql;
        }

        public TsqlCommand DeleteByIds(string[] ids)
        {
            string strIds = string.Join(",", ids);
            TsqlCommand sql = ModelReflection<Student>.DeleteByIds(strIds);
            return sql;
        }


        public TsqlCommand GetListByPaging(PagingCondtion<Student> condition)
        {
            return null;
        }

    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data.SqlClient;
using System.Data;

using DB.Util;
using DB.Entity;
using Logic.Entity;
using DB.DAO;


namespace DB.BIZ
{
    public class StudentBIZ
    {

        DBSchool db = new DBSchool();
        StudentDAO dal = new StudentDAO();

        public LeStudent GetStudenById(int id)
        {

            LeStudent student = null;
            using (SqlConnection conn = new SqlConnection(db.GetConnection()))
            {
                conn.Open();
                SqlTransaction tran = conn.BeginTransaction();//开启一个事物

                try
                {

                    TsqlCommand tsql = dal.GetByID(id);
                    SqlCommand command = tsql.CreateCommand(conn, tran);
                    Student stu = SqlModelHelper<Student>.GetSingleObjectBySql(command);

                    student = new LeStudent();
                    student.ID = stu.ID;
                    student.Name = stu.Name;


                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    throw ex;
                }
                finally
                {
                    tran.Dispose();
                    conn.Close();
                }
            }
            return student;
        }



        public bool DeleteStudentById(int id)
        {
            bool result = false;
            using (SqlConnection conn = new SqlConnection(db.GetConnection()))
            {
                conn.Open();
                SqlTransaction tran = conn.BeginTransaction();//开启一个事物

                try
                {
                    TsqlCommand tsql = dal.Delete(id);
                    SqlCommand command = tsql.CreateCommand(conn, tran);
                    int rowCount = command.ExecuteNonQuery();
                    result = (rowCount > 0);
                    tran.Commit();
                }
                catch (Exception ex)
                {
                    tran.Rollback();
                    throw ex;
                }
                finally
                {
                    tran.Dispose();
                    conn.Close();
                }
            }
            return result;
        }



        public bool DeleteStudentById2(int id)
        {
            bool result = false;
            DBDelegate<int> dele = new DBDelegate<int>();
            int rowCount = dele.Open(db.GetConnection(), dal.Delete(id),Delete);

            result = (rowCount > 0);
            return result;
        }

        int Delete(TsqlCommand tsql, SqlConnection conn, SqlTransaction tran)
        {
            SqlCommand command = tsql.CreateCommand(conn, tran);
            int rowCount = command.ExecuteNonQuery();
            return rowCount;
        }

        public LeStudent GetStudenById2(int id)
        {
            LeStudent student = null;
            DBDelegate<Student> dele = new DBDelegate<Student>();

            Student stu = dele.Open(db.GetConnection(), dal.GetByID(id), GetModel);

            student = new LeStudent();
            student.ID = stu.ID;
            student.Name = stu.Name;
            return student;
        }

        Student GetModel(TsqlCommand tsql, SqlConnection conn, SqlTransaction tran)
        {
            SqlCommand command = tsql.CreateCommand(conn, tran);
            Student stu = SqlModelHelper<Student>.GetSingleObjectBySql(command);
            return stu;
        }

    }
}