此系列文章记录我开发ORM的过程。

     开篇:Attribute准备

     我们需要利用Attribute来完成某些信息的配置,在nhibernate中我们使用的是XML文件来配置主键,字段映射,实体之间的关系,级联操作等等关系。这也带来了许多的问题,大部分的使用nhibernate开发的人员都会抱怨XML文件的管理,以及编写问题。笔者实践的这个ORM为了更好的提高用户体验,决定舍弃XML配置关系信息的方式,所有的相关信息都使用Attribute来实现。例如:

public class student{

 string name;

 string child_name;

}

 一个学生类,包含两个信息。姓名以及小时候的名字,如果我们的业务逻辑需要,把所有学生小时候的名字同意显示为 “小+name"  那么我们就根本不需要开辟child_name属性到数据库,自然也就不需要保存了。这是使用Attribute来实现这一功能我们可以这样写:

 [Ignore]

 string child_name;

 当然首先我们需要实现这些Attribute。

既然上面已经提到了这个  [Ignore] 那么我们就来先实现它吧。

 

[Serializable, AttributeUsage(AttributeTargets.Property)]
    
public class IgnoreAttribute : Attribute
    {
    }

 看出个究竟来了没有?为什么类里面是空的?这样做的意义是什么?

这里的 IgnoreAttribute仅仅只是起到一个标识作用,这就相当于一个bool类型的属性,它只有两种可能,不是true就是false,这也是同样的道理,用定义了 [Ignore]与没有定义 [Ignore]来模拟true和false。[Serializable]标识该类能够被序列化,方便以文件的方式持久保存。AttributeUsage(AttributeTargets.Property)表示[Ignore]这个Attribute只能用于属性,不能用于方法或类。强制定义它的使用范围。

本文既然是 Attribute准备 ,那么我们就要一次性实现所有的Attribute。

 

[AttributeUsage(AttributeTargets.Property)]
    
public sealed class ColumnAttribute : Attribute
    {
        
private string _column;
        
private DataType dataType;
        
private int length=255;
        
private bool canNull=true;
        
private object defaultValue;
        
private bool autoIncrement = false;
        
private bool isUnique=false;

        
public ColumnAttribute()
        {
        }
        
public ColumnAttribute(string paraColumn,DataType dataType)
        {
            
this._column = paraColumn;
            
this.dataType = dataType;
        }
        
public ColumnAttribute(string paraColumn,DataType dataType,int length,bool canNull,object defaultValue,bool autoIncrement,bool isUnique)
        {
            
this._column = paraColumn;
            
this.dataType = dataType;
            
this.length = length;
            
this.canNull = canNull;
            
this.defaultValue = defaultValue;
            
this.autoIncrement = autoIncrement;
            
this.isUnique = isUnique;
        }



        
/// <summary>
        
/// 表字段的数据类型
        
/// </summary>
        public DataType DataType
        {
            
get { return dataType; }
            
set { dataType = value; }
        }
        
/// <summary>
        
/// 数据库中的列
        
/// </summary>
        public string Column
        {
            
get { return _column; }
            
set { _column = value; }
        }

        
/// <summary>
        
/// 表字段的长度
        
/// </summary>
        public int Length
        {
            
get { return length; }
            
set { length = value; }
        }

        
/// <summary>
        
/// 表字段是否可以为空
        
/// </summary>
        public bool CanNull
        {
            
get { return canNull; }
            
set { canNull = value; }
        }

        
/// <summary>
        
/// 表字段的默认值
        
/// </summary>
        public object DefaultValue
        {
            
get { return defaultValue; }
            
set { defaultValue = value; }
        }
        
/// <summary>
        
/// 表字段是否为自动增长列
        
/// </summary>
        public bool AutoIncrement
        {
            
get { return autoIncrement; }
            
set { autoIncrement = value; }
        }
        
/// <summary>
        
/// 确定某个字段是否唯一
        
/// </summary>
        public bool IsUnique
        {
            
get { return isUnique; }
            
set { isUnique = value; }
        }
    }

相关文章:

  • 2021-11-19
  • 2021-08-02
  • 2022-12-23
  • 2021-10-02
  • 2022-12-23
猜你喜欢
  • 2021-07-27
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-17
相关资源
相似解决方案