C#根据反射和特性实现ORM映射实例分析

实现ORM映射可以使用反射和特性相结合的方式来完成。这篇文章将详细介绍使用C#反射和特性来实现ORM映射的全过程。

1.什么是ORM

ORM(Object Relational Mapping)即对象关系映射,在软件开发中经常用来将数据库中的数据转化为对象,使操作数据库变得更加简单和方便。ORM通常由程序代码和XML或注释等配置文件组成,其中程序代码使用反射和特性来读取和处理配置文件,从而实现将数据库和对象之间的转换。

2.ORM映射实现步骤

ORM映射实现大致包含以下几个步骤:

2.1 创建实体类

首先需要创建实体类,该类表示将要映射到数据库的表结构。

    public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
    }

2.2 创建特性

创建特性用于配置实体类与数据库表之间的映射关系。例如:

    public class TableNameAttribute : Attribute
    {
        public string Name { get; set; }

        public TableNameAttribute(string name)
        {
            this.Name = name;
        }
    }

    public class FieldNameAttribute : Attribute
    {
        public string Name { get; set; }

        public FieldNameAttribute(string name)
        {
            this.Name = name;
        }
    }

2.3 利用反射和特性读取实体类配置信息

使用反射和特性读取实体类的属性和特性,生成SQL语句等相关配置信息。

    public class EntityHelper<T>
    {
        private static string _tableName;
        private static Dictionary<string, string> _fieldMappings;

        static EntityHelper()
        {
            _tableName = typeof(T).GetCustomAttribute<TableNameAttribute>().Name;
            _fieldMappings = new Dictionary<string, string>();

            var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (var p in properties)
            {
                var fieldName = p.GetCustomAttribute<FieldNameAttribute>().Name;
                if (string.IsNullOrWhiteSpace(fieldName))
                {
                    fieldName = p.Name;
                }

                _fieldMappings[p.Name] = fieldName;
            }
        }

        public static string GetInsertSql(T entity)
        {
            string sql = $"INSERT INTO {_tableName} ({string.Join(",", _fieldMappings.Values)}) VALUES (";

            var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (var p in properties)
            {
                string fieldName = _fieldMappings[p.Name];

                var fieldValue = p.GetValue(entity);
                if (fieldValue != null)
                {
                    sql += $"'{fieldValue}',";
                }
                else
                {
                    sql += "NULL,";
                }
            }

            sql = sql.Remove(sql.Length - 1);
            sql += ")";

            return sql;
        }
    }
}

2.4 使用ORM

使用ORM映射,可以将对象转化为数据库表格式,或者将数据库表格式转化为对象。例如:

        static void Main(string[] args)
        {
            User user = new User()
            {
                Id = 1,
                UserName = "test",
                Password = "123456"
            };

            string insertSql = EntityHelper<User>.GetInsertSql(user);
            Console.WriteLine(insertSql);
        }

3. 示例说明

3.1 示例一

假设我们有以下表结构:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

我们可以创建一个与该表结构对应的User类,并通过特性和反射来实现ORM映射。

    [TableName("user")]
    public class User
    {
        [FieldName("id")]
        public int Id { get; set; }

        [FieldName("user_name")]
        public string UserName { get; set; }

        [FieldName("password")]
        public string Password { get; set; }
    }

3.2 示例二

假设我们需要将一个DataTable对象转化为对象列表,我们可以使用ORM映射来轻松实现该功能。

    public static List<T> DataTableToList<T>(DataTable dataTable) where T : new()
    {
        List<T> list = new List<T>();

        foreach (DataRow row in dataTable.Rows)
        {
            T obj = new T();

            Type type = typeof(T);

            foreach (var property in type.GetProperties())
            {
                var fieldAttribute = property.GetCustomAttributes(typeof(FieldNameAttribute), true).FirstOrDefault() as FieldNameAttribute;

                if (fieldAttribute != null && dataTable.Columns.Contains(fieldAttribute.Name))
                {
                    property.SetValue(obj, Convert.ChangeType(row[fieldAttribute.Name], property.PropertyType));
                }
                else if (dataTable.Columns.Contains(property.Name))
                {
                    property.SetValue(obj, Convert.ChangeType(row[property.Name], property.PropertyType));
                }
            }

            list.Add(obj);
        }

        return list;
    }

使用ORM映射,可以轻松将DataTable对象转换为我们需要的类型。例如:

        static void Main(string[] args)
        {
            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("id", typeof(int));
            dataTable.Columns.Add("user_name", typeof(string));
            dataTable.Columns.Add("password", typeof(string));

            dataTable.Rows.Add(1, "test1", "123456");
            dataTable.Rows.Add(2, "test2", "654321");

            List<User> userList = EntityHelper.DataTableToList<User>(dataTable);
            Console.WriteLine(userList[0].UserName);
            Console.WriteLine(userList[1].Password);
        }

通过以上两个示例,我们可以看到,使用ORM映射不仅可以减少开发工作量,而且可以使代码更加简洁和易读,提高开发效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#根据反射和特性实现ORM映射实例分析 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C#动态加载组件后如何在开发环境中调试详解

    要在开发环境中调试C#动态加载组件,可以按照以下步骤进行: 第一步:将组件代码添加到解决方案中 首先,需要将组件代码添加到解决方案中,这样才可以在开发环境中进行调试。具体步骤如下: 在Visual Studio中打开主项目的解决方案,右键点击解决方案文件夹,选择“添加”>“现有项目”将组件代码项目添加到解决方案中; 如果组件代码使用了外部依赖项,需要将…

    C# 2023年6月6日
    00
  • Unity多语言转换工具的实现

    Unity多语言转换工具的实现攻略 背景 在Unity游戏开发应用途中,多语言支持是必不可少的功能,为了能够让游戏适应不同的国家或地区,我们需要使用多语言转换工具实现简单的针对不同语言的转换和输出。 实现方法 我们可以通过以下步骤实现Unity多语言转换工具: 1. 创建语言文件 先在项目中创建多个不同语言的语言文件(如中文语言文件、英文语言文件等),并将这…

    C# 2023年5月31日
    00
  • 浅谈ASP.NET Core的几种托管方式

    浅谈ASP.NET Core的几种托管方式 ASP.NET Core是一个跨平台的Web应用程序框架,可以在Windows、Linux和macOS上运行。在ASP.NET Core中,有几种不同的托管方式可供选择。本攻略将介绍ASP.NET Core的几种托管方式,并提供两个示例说明。 IIS托管 IIS是Windows操作系统中的Web服务器,可以使用II…

    C# 2023年5月16日
    00
  • Global.cs中自动获取未处理的异常

    首先,我们需要了解.NET框架的全局异常处理机制。在.NET中,我们可以通过捕获未处理的异常来处理程序运行时的错误,以便更好地改善用户体验。而要实现这一机制,我们可以利用Global.cs文件来自动获取未处理的异常。 具体实现方式如下: 在Global.cs文件中重写Application_Error方法。在这个方法中,我们可以用try-catch语句捕获未…

    C# 2023年5月15日
    00
  • VC创建进程CreateProcess的方法

    VC创建进程CreateProcess的方法需要以下几步: 1. 引用头文件和命名空间 在使用CreateProcess方法前需要在工程中引入Windows.h头文件,并在代码中调用Windows命名空间。 #include <Windows.h> using namespace std; 2. 定义参数和启动信息 我们需要定义以下几个参数: l…

    C# 2023年5月31日
    00
  • C# 获取系统DPI缩放比例以及分辨率大小

    一般方法 System.Windows.Forms.Screen类 // 获取当前主屏幕分辨率 int screenWidth = Screen.PrimaryScreen.Bounds.Width; int screenHeight = Screen.PrimaryScreen.Bounds.Height; // 获取指定屏幕分辨率 Screen seco…

    C# 2023年4月27日
    00
  • C# Random类的正确应用方法

    下面就来详细讲解“C# Random类的正确应用方法”的完整攻略。 什么是C# Random类? C#中的Random类是用于生成随机数的类,它包含在System命名空间中。Random类使用一个伪随机数生成器来产生随机数,该生成器使用的是一个种子值,该种子值可以是用户自定义的,也可以是系统提供的。 Random类的正确使用方法 创建Random对象 Ran…

    C# 2023年6月1日
    00
  • 使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件

    在一些字典绑定中,往往为了方便展示详细数据,需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中,为了快速的处理数据的绑定操作,比较每次使用涉及太多细节的操作,我们可以把相关的数据绑定操作,放在一些辅助类的扩展函数中进行处理,这样可以更方便的,更简洁的处理数据绑定操作,本篇随笔介绍TreeList…

    C# 2023年4月30日
    00
合作推广
合作推广
分享本页
返回顶部