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日

相关文章

  • 电脑绘画软件哪个好?常用的绘画软件有哪些?

    电脑绘画软件是一种方便快捷的数字绘画工具,通过它们,用户可以在计算机上进行绘画、设计和插图等创作。常用的绘画软件有以下几种: 1. Adobe Photoshop Adobe Photoshop是一款强大的图像处理软件,因为其具有广泛的功能和创造力而被广泛使用。除了像画笔、橡皮擦和填充工具之类的基本绘画工具外,Photoshop还包括许多专业的效果和滤镜,并…

    C# 2023年6月7日
    00
  • webpack-dev-server核心概念案例详解

    webpack-dev-server核心概念案例详解 webpack-dev-server是一个基于Node.js的开发服务器,它可以实时重新加载页面,提高开发效率。本文将详细讲解webpack-dev-server的核心概念,并提供两个示例。 1. 安装webpack-dev-server 在使用webpack-dev-server之前,需要先安装它。可以…

    C# 2023年5月15日
    00
  • C#文件断点续传实现方法

    C#文件断点续传实现方法攻略 背景和原理介绍 在文件传输中,当传输过程中出现异常,或连接中断,一般需要重新传输。但如果文件太大,重新传输的成本太高,而此时恰好传输过程中已经传输了一部分,通过断点续传可以只续传未完成的部分,可以大幅减少传输成本。文件断点续传实现的原理,在下载时是通过请求服务端时在header部分加上range请求头,标明下载文件的起止断点,服…

    C# 2023年6月1日
    00
  • SQLite 入门教程三 好多约束 Constraints

    SQLite 入门教程三 好多约束 Constraints 在SQLite中,可以使用约束(Constraints)来保证表中数据的完整性和一致性。本教程将详细介绍SQLite数据库中支持的主要约束类型。 1. NOT NULL 使用NOT NULL约束可以保证指定的列必须有值,而不能为NULL(即空值)。以下是一个实例: CREATE TABLE Stud…

    C# 2023年5月31日
    00
  • unity实现鼠标经过时ui及物体的变色操作

    实现鼠标经过时UI及物体的变色操作是Unity游戏开发中常见的操作之一,在以下内容中,我将详细讲解如何实现这个功能。 步骤一:添加事件触发器组件 首先,在需要变色的UI或物体上添加Event Trigger组件。在该组件下选择PointerEnter和PointerExit事件,并在事件右侧选择Add New。这样就可以添加新的触发事件。 在PointerE…

    C# 2023年6月3日
    00
  • C#保存图片到数据库并读取显示图片的方法

    整体思路 将图片转换为二进制,然后将二进制数据存储到数据库中,读取时从数据库中读取二进制数据,再将二进制数据转换为图片。 示范代码1:保存图片到数据库 首先,我们需要创建一个包含二进制数据的表格来存储图片。在该表格上创建两个字段:图片ID和图片内容。然后,使用下面的代码将图片转换为二进制数据,并将其插入到表格中: // 读取图片文件 FileStream f…

    C# 2023年6月2日
    00
  • C# 执行CMD命令并接收返回结果的操作方式

    下面我会详细讲解如何在C#中执行CMD命令并接收返回结果的操作方式,步骤如下: 第一步:引入命名空间和创建Process对象 using System.Diagnostics; 通过引入System.Diagnostics命名空间,我们可以使用Process类来执行CMD命令并接收返回结果。我们需要先创建一个Process对象来执行CMD命令,以便可以设置P…

    C# 2023年5月15日
    00
  • C# 表达式树Expression Trees的知识梳理

    下面是关于“C# 表达式树 Expression Trees的知识梳理”的攻略。 什么是表达式树? 表达式树是一种数据结构,用于表示代码中的表达式。在C#中,每个表达式都可以转换成一个表达式树。表达式树实际上是一个表达式的对象表示形式,其包含了表达式的所有元素,如运算符、操作数和子表达式。 为什么要使用表达式树? 表达式树有许多应用场景,其中最常见的用途是L…

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