轻量级ORM开发系列:Model类相关信息的处理
本文主要解决ORM开发过程中Model类在ORM层产生的信息,在开始这篇文章之前,你有必要了解这个轻量级ORM设置的类相关信息类以及属性相关信息类,如果你还不了解,请阅读一文轻量级ORM开发系列:Attribute准备一文。
在ORM中,每个Model类都有相关的属性以及信息(如TableAttribute),每个属性又对应着与之相关的信息(如ColumnAttribute,IgnoreAttribute等等),这篇文章主要描述一下我的属性信息是怎么解决的。
首先,我申明了一个EntityPropertyInfo类,这个类来存储与属性相关的信息。代码如下:

/// 说明:若是一个被忽略的属性,则只有相关的Property,Type信息,此时IsIgnore为true
/// </summary>
public class EntityPropertyInfo
{
/// <summary>
/// 对他所属于的EntityInfo的引用
/// </summary>
public EntityInfo EntityInfo { get; set; }
public String ColumnName { get; set; }
public Type Type { get; set; }
public PropertyInfo Property { get; set; }
public Boolean IsAutoIncrement { get; set; }
public Boolean IsIgnore { get; set; }
public ColumnAttribute ColumnAttribute { get; set; }
public static EntityPropertyInfo Get(PropertyInfo property, EntityInfo paraEntityInfo)
{
EntityPropertyInfo epi = new EntityPropertyInfo();
epi.Property = property;
epi.Type = property.PropertyType;
epi.EntityInfo = paraEntityInfo;
epi.IsIgnore = property.IsDefined(typeof(IgnoreAttribute), false);
if (!epi.IsIgnore)//
{
epi.ColumnAttribute = FoxReflection.GetAttribute(property, typeof(ColumnAttribute)) as ColumnAttribute;
//列名的处理
epi.ColumnName = epi.ColumnAttribute == null ? property.Name : epi.ColumnAttribute.Column;
if (epi.ColumnAttribute == null)
{
epi.ColumnAttribute = new ColumnAttribute();
}
if (epi.ColumnName == null)
{
epi.ColumnName = property.Name;//即使该属性有ColumnAttribute,但也不一定设定了列名
epi.ColumnAttribute.Column = property.Name;//同步到ColumnAttribute,防止以后引用导致出错
}
if (property.PropertyType is IList)
{
// epi.HasOne2ManyRelation = true;
}
}
return epi;
}
}
这个类的Get方法还没有写完,如果你看到了这里,想进一步完善他的话可以与我取得联系获得源代码,我现在已经没有精力回头去研究这些东西了,这些博文也只是记录一下我在这段时期研究过哪些东西而已。如果你是为了学习的目的的话,我觉得还是会蛮有收获的,至少我觉得是这样。
EntityPropertyInfo类就是对一个属性所有的信息做一个集合。以方便后面的处理,这里我们同样对我们的Model进行一个这样的封装,建立一个新的类,EntityInfo类来集合所有的 Model在ORM中需要用到的信息。

public class EntityInfo
{
public TableAttribute Table{ get ;set ;}
/// <summary>
/// 标识是否已经对此类进行了CREAT_SQL语句生成
/// </summary>
public IList<PropertyInfo> PropertyList = new List<PropertyInfo>();
public IList<EntityPropertyInfo> EntityPropertiesList = new List<EntityPropertyInfo>();
public string TypeFullName { get; set; }
public string TableName { get; set; }
public string DataBaseName { get; set; }
/// <summary>
///
/// </summary>
public EntityPropertyInfo PrimaryKey { get; set; }
/// <summary>
/// 获取需要ORM操作的属性的个数
/// </summary>
/// <returns></returns>
public int GetUsedCount()
{
int count = 0;
foreach (EntityPropertyInfo epi in EntityPropertiesList)
{
if (!epi.IsIgnore)
{
count++;
}
}
return count;
}
}
这里实现了一个IList<EntityPropertyInfo>的集合,这样一个类的所有属性就可以顺序的索引到。这位后面数据的赋值以及初始化等等操作都打下了基础。
public string TypeFullName { get; set; } //类型全名
public string TableName { get; set; } //映射的数据库表名
public string DataBaseName { get; set; } //数据库名,这意味着我们的程序可以跨数据库操作表。
有了这两个类,这个轻量级ORM信息处理的即使就打好了,当然,在后面我们会看到怎么让Model类以及其属性变成相应的EntityInfo类以及IList<EntityPropertyInfo>集合,在ORM里面我们不可能所有的信息都通过反射临时来获取,反射可不是省油的灯,所以我们在看轻量级ORM的缓存设计的时候也会基于这里讲到的两个存储信息的类。这些提到的部分将会在后面一一补充。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?