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#中格式化数字字符串的方法。 使用ToString方法格式化数字字符串 在C#中,我们可以使用ToString方法来将数字格式化为字符串。该方法有许多重载,可以用于格式化不同类型的数字,下面是一些常见的用法。 1. 格式化整数 对于整数类型,可以使用ToString方法的重载形式来指定需要的格式,例如: int num = 123…

    C# 2023年5月15日
    00
  • C#指针变量与unsafe的实现

    关于C#指针变量与unsafe的实现,可以按照以下步骤进行操作: 1. 允许使用指针 C#编译器默认禁止使用指针,需要手动在代码文件中加入unsafe关键字来允许使用指针。示例代码: unsafe { // 能够使用指针的代码块 } 2. 声明指针变量 在C#中,使用*运算符可以声明一个指向某种类型的指针变量。例如: int n = 10; int* p =…

    C# 2023年6月7日
    00
  • .NetCore使用ImageSharp进行图片的生成

    ImageSharp是一个跨平台的图像处理库,可以帮助我们在Asp.Net Core应用程序中进行图像的生成、处理和转换等操作。在本文中,我们将详细讲解如何在Asp.Net Core应用程序中使用ImageSharp进行图片的生成,包括环境搭建、代码实现、示例说明等。 环境搭建 在开始使用ImageSharp之前,我们需要先搭建好Asp.Net Core的开…

    C# 2023年5月16日
    00
  • 轻松学习C#的密封类

    当你想要将一个类定义为不可继承时,你可以将这个类标记为密封类。C#中的密封类与Java中的final类相似,不允许其他类继承它。 如何定义一个密封类? 在C#中,我们可以通过在类的前面添加 sealed 关键字来定义一个密封类。例如: sealed class MySealedClass { // 类定义 } 密封类的特点 密封类不能被其他类继承。 密封类一…

    C# 2023年5月15日
    00
  • C#中TransactionScope的使用小结

    C#中TransactionScope的使用小结 1. 什么是TransactionScope TransactionScope是C#中一个用于管理事务的类,位于System.Transactions命名空间中。它可以让多条语句成为一个事务,从而保证在一个事务中,要么所有语句都执行成功,要么全部失败。 2. TransactionScope的使用方法 步骤1…

    C# 2023年5月15日
    00
  • 效控制C#中label输出文字的长度,自动换行

    效控制C#中label输出文字的长度,自动换行的方法: 使用AutoEllipsis属性 可以使用C#中的Label控件中的AutoEllipsis属性实现标签控件中输出文字的长度的控制。在Winform应用程序中,将AutoEllipsis属性设置为true即可实现标签文字长度过长时的自动省略号替换。示例代码如下: label1.AutoEllipsis …

    C# 2023年6月7日
    00
  • C#打印日志的方法总结

    针对“C#打印日志的方法总结”,以下是详细的攻略: 什么是日志 在开发过程中,我们需要记录一些关键信息来方便排查问题或者进行后续分析。而日志就是我们记录这些信息的工具。日志可以记录程序运行时的各种信息,包括但不限于:debug信息、错误堆栈信息、请求和响应信息等。而我们可以使用一些工具来进行日志的打印和管理。 C#中的日志打印方法 1.使用Trace和Deb…

    C# 2023年5月15日
    00
  • Asp.Net Core利用文件监视进行快速测试开发详解

    Asp.Net Core利用文件监视进行快速测试开发详解 在Asp.Net Core中,我们可以利用文件监视(File Watcher)来进行快速测试开发。文件监视可以在文件发生更改时自动重新编译和重新启动应用程序,从而加快开发速度。在本攻略中,我们将深入讲解如何利用文件监视进行快速测试开发,并提供两个示例说明。 步骤 以下是利用文件监视进行快速测试开发的步…

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