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#定时任务框架Quartz.NET介绍与用法

    C#定时任务框架 Quartz.NET 介绍与用法 Quartz.NET 是一个强大的、开源的定时任务调度框架,它可以用于 C# 编程语言中。 框架介绍 Quartz.NET 与 .NET Framework 完美结合,允许开发人员在自己的应用程序中创建并组织复杂的、企业级的定时任务调度系统。它被广泛应用于金融、电信、物流等领域,可以帮助开发人员在开发定时任…

    C# 2023年5月31日
    00
  • Unity Shader片段着色器使用基础详解

    Unity Shader片段着色器使用基础详解 Unity中的Shader(着色器)用于控制游戏对象的渲染方式,让它们变得更加美观、细致。Shader分为顶点着色器和片段着色器,这篇攻略主要介绍Unity中片段着色器的使用基础,可以帮助开发者更加细致地控制对象的渲染方式。 Shader基础知识 在进入片段着色器的详细使用说明前,我们先来了解一些Shader的…

    C# 2023年6月3日
    00
  • 浅析C#数据类型转换的几种形式

    浅析C#数据类型转换的几种形式 C#数据类型转换是将一个数据类型的值转换为另一个数据类型的值。在使用C#时,有时候需要将不同类型的数据进行转换,例如将字符串转换为整数类型或将整数类型转换为浮点类型。在C#中,数据类型的转换可以使用以下几种形式: 1. 强制转换 强制转换是将一个数据类型强制转换为另一个数据类型的形式。当源数据类型和目标数据类型不同时,需要使用…

    C# 2023年5月15日
    00
  • asp.net(C#)操作excel(上路篇)

    下面我就来详细讲解“asp.net(C#)操作excel(上路篇)”的完整攻略。 标题 1. 安装插件 要在ASP.NET(C#)中操作Excel表格,需要安装一个名为“Microsoft.Office.Interop.Excel”的插件。具体步骤:1. 打开Visual Studio;2. 依次选择“文件” –> “新建” –> “项目”;…

    C# 2023年6月1日
    00
  • C#日历样式的下拉式计算器实例讲解

    下面我来详细讲解一下“C#日历样式的下拉式计算器实例讲解”的完整攻略。 一、准备工作 在开始之前,我们需要完成以下准备工作: 安装好Visual Studio开发环境 创建一个Windows Froms应用程序项目 在表单中添加控件:日历控件、文本框控件、下拉框控件、按钮控件等 二、编写代码 1. 日历控件的使用 首先,我们需要使用日历控件来获取日期。在窗体…

    C# 2023年6月6日
    00
  • C#中使用JSON.NET实现JSON、XML相互转换

    下面是使用JSON.NET实现JSON、XML相互转换的攻略: 1. 引入JSON.NET包 在C#中实现JSON、XML相互转换,需要引入JSON.NET包。可以通过NuGet包管理器来安装JSON.NET。打开NuGet包管理器,搜索JSON.NET,然后安装即可。 2. 将JSON字符串转为XML格式 在使用JSON.NET将JSON字符串转为XML格…

    C# 2023年5月15日
    00
  • Asp.net配合easyui实现返回json数据实例

    下面是 “Asp.net配合easyui实现返回json数据实例” 的完整攻略: 什么是Asp.net与EasyUI配合返回JSON数据 Asp.net是一种基于Microsoft .NET平台的Web开发技术,其核心是ASP.NET框架,可帮助开发者快速创建强大的Web应用。而EasyUI是一种JavaScript框架,可用于创建复杂的Web界面和互动体验…

    C# 2023年5月31日
    00
  • ASP.NET Core中的Caching组件简介

    ASP.NET Core中的Caching组件简介 ASP.NET Core中的Caching组件是一种用于缓存数据的机制。它允许我们将数据缓存在内存、分布式缓存或其他缓存存储中,以提高应用程序的性能和响应速度。本攻略将详细介绍ASP.NET Core中的Caching组件的概念、用法和示例。 什么是Caching组件? Caching组件是一种用于缓存数据…

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