实现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技术站