看到有同学反馈,说MiniORM代码有Bug,也不知道怎么用,所以今天我就写了些测试代码。希望能够给点帮助。
同时也发现了两Bug,一并罗列出:
1、MiniORM.PubFuncs.GetObjectType()函数:
同时也发现了两Bug,一并罗列出:
1、MiniORM.PubFuncs.GetObjectType()函数:
- public static Type GetObjectType(string assemblyname, string namespacename, string classname)
- {
- Type objType = (Type)_HashObjectType[assemblyname + namespacename + classname];
- if (objType == null)
- {
- object obj = _HashObjectType[assemblyname + namespacename + classname];
- obj = Assembly.Load(assemblyname).CreateInstance(namespacename + "." + classname);
- _HashObjectType[assemblyname + namespacename + classname] = obj.GetType();
- //需要增加这句
- objType = (Type)_HashObjectType[assemblyname + namespacename + classname];
- }
- return objType;
- }
2、MiniORM.OrmWriter.CheckValidate()函数:
- public void CheckValidate(object ModelObject)
- {
- PropertyInfo[] infos = ModelObject.GetType().GetProperties();
- object[] CustomerAttributes = null;
- object[] CustomerAttributes1 = null;
- //SELECT ID FROM TableName WHERE @A='' OR @B=''
- string strSQL = "SELECT ID FROM {0} WHERE {1}";
- string strTablename = PubFuncs.GetTableName(ModelObject);
- string strWOA = "";
- string strWHERE = "";
- string strFieldMessage = "";
- foreach (PropertyInfo info in infos)
- {
- CustomerAttributes = info.GetCustomAttributes(typeof(MiniORMAttribute.DataFieldNotDoubleAttribute), false);
- CustomerAttributes1 = info.GetCustomAttributes(typeof(MiniORMAttribute.DataFieldAttribute), false);
- if (CustomerAttributes != null && CustomerAttributes1 != null)
- {
- for (int i = 0; i < CustomerAttributes.Length; i++)
- {
- strWHERE += strWOA + ((MiniORMAttribute.DataFieldAttribute)CustomerAttributes1[0]).FieldName + "='" + info.GetValue(ModelObject, null) + "'";
- strFieldMessage += ((MiniORMAttribute.DataFieldAttribute)CustomerAttributes1[0]).FieldName;
- strWOA = " OR ";
- }
- }
- }
- //这里需要做strWHERE不为空的判断
- if (strWHERE.Trim() != "")
- {
- strSQL = string.Format(strSQL, new string[] { strTablename, strWHERE });
- using (SqlConnection conn = new SqlConnection(PubFuncs.ConnectionStr))
- {
- conn.Open();
- SqlCommand cmd = new SqlCommand();
- cmd.Connection = conn;
- cmd.CommandType = CommandType.Text;
- cmd.CommandText = strSQL;
- using (SqlDataReader rdr = cmd.ExecuteReader())
- {
- if (rdr.Read())
- {
- throw new Exception("下列字段值不能重复:" + strFieldMessage);
- }
- }
- }
- }
- }
测试代码如下:
首先是类关系图:
数据库表:
Person表:
Hand表:
Head表:
测试代码如下:
下面是类代码:
- [DataObjectAttribute("Person", "ID", "")]
- public class Person
- {
- private int _ID;
- private string _Name;
- private int _Age;
- private string _Sex;
- private Head _Head;
- private Hand _LeftHand;
- private Hand _RightHand;
- [DataFieldAttribute("ID", true)]
- public int ID
- {
- get { return _ID; }
- set { _ID = value; }
- }
- [SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Head")]
- public Head Head
- {
- get { return _Head; }
- set { _Head = value; }
- }
- [SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
- public Hand LeftHand
- {
- get { return _LeftHand; }
- set { _LeftHand = value; }
- }
- [SubDataObjectAttribute(SubDataObjectFieldType.Object, "MiniORM", "MiniORM", "Hand")]
- public Hand RightHand
- {
- get { return _RightHand; }
- set { _RightHand = value; }
- }
- [DataFieldAttribute("name", "NvarChar")]
- public string Name
- {
- get { return this._Name; }
- set { this._Name = value; }
- }
- [DataFieldAttribute("age", "int")]
- public int Age
- {
- get { return this._Age; }
- set { this._Age = value; }
- }
- [DataFieldAttribute("sex", "NvarChar")]
- public string Sex
- {
- get { return this._Sex; }
- set { this._Sex = value; }
- }
- public Hand Hand
- {
- get
- {
- throw new System.NotImplementedException();
- }
- set
- {
- }
- }
- public Head Head1
- {
- get
- {
- throw new System.NotImplementedException();
- }
- set
- {
- }
- }
- }
- [DataObjectAttribute("Hand", "ID", "PersonID")]
- public class Hand
- {
- private int _ID;
- private int _PersonID;
- private string _Name;
- [DataFieldAttribute("ID", true)]
- public int ID
- {
- get { return this._ID; }
- set { this._ID = value; }
- }
- [DataFieldAttribute("PersonID")]
- public int PersonID
- {
- get { return this._PersonID; }
- set { this._PersonID = value; }
- }
- [DataFieldAttribute("name", "NvarChar")]
- public string Name
- {
- get { return _Name; }
- set { _Name = value; }
- }
- }
- [DataObjectAttribute("Head", "ID", "PersonID")]
- public class Head
- {
- private int _ID;
- private int _PersonID;
- private string _Name;
- [DataFieldAttribute("ID", true)]
- public int ID
- {
- get { return this._ID; }
- set { this._ID = value; }
- }
- [DataFieldAttribute("PersonID")]
- public int PersonID
- {
- get { return this._PersonID; }
- set { this._PersonID = value; }
- }
- [DataFieldAttribute("name", "NvarChar")]
- public string Name
- {
- get { return _Name; }
- set { _Name = value; }
- }
- }
下面是测试代码:
- [STAThread]
- static void Main()
- {
- //插入测试
- WriteTest();
- //读取测试
- ReadTest();
- }
- private static void WriteTest()
- {
- Person person = new Person();
- person.Name = "snoopy";
- person.Age = 5;
- person.Sex = "male";
- Hand lefthand = new Hand();
- lefthand.Name = "左手";
- Hand righthand = new Hand();
- righthand.Name = "右手";
- Head head = new Head();
- head.Name = "大笨脑袋";
- person.LeftHand = lefthand;
- person.RightHand = righthand;
- person.Head = head;
- MiniORM.OrmWriter write = new OrmWriter();
- write.Write(person);
- }
- private static void ReadTest()
- {
- MiniORM.OrmReader reader = new OrmReader();
- Person person = (Person)reader.Read(new Person(), 1);
- Console.WriteLine("person.Name:" + person.Name);
- Console.WriteLine("person.Age:" + person.Age);
- Console.WriteLine("person.Sex:" + person.Sex);
- Console.WriteLine("LeftHand.Name:" + person.LeftHand.Name);
- Console.WriteLine("RightHand.Name:" + person.RightHand.Name);
- Console.WriteLine("Head.Name:" + person.Head.Name);
- Console.Read();
- }
ReadTest的测试结果如:
好了,各位,你可以使用这个调试代码来试试了。。。
相关文章:
C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)