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