C#基础系列:实现自己的ORM(MiniORM的测试代码)

看到有同学反馈,说MiniORM代码有Bug,也不知道怎么用,所以今天我就写了些测试代码。希望能够给点帮助。
同时也发现了两Bug,一并罗列出:
1、MiniORM.PubFuncs.GetObjectType()函数:

  1. publicstaticTypeGetObjectType(stringassemblyname,stringnamespacename,stringclassname)
  2. {
  3. TypeobjType=(Type)_HashObjectType[assemblyname+namespacename+classname];
  4. if(objType==null)
  5. {
  6. objectobj=_HashObjectType[assemblyname+namespacename+classname];
  7. obj=Assembly.Load(assemblyname).CreateInstance(namespacename+"."+classname);
  8. _HashObjectType[assemblyname+namespacename+classname]=obj.GetType();
  9. //需要增加这句
  10. objType=(Type)_HashObjectType[assemblyname+namespacename+classname];
  11. }
  12. returnobjType;
  13. }

2、MiniORM.OrmWriter.CheckValidate()函数:

  1. publicvoidCheckValidate(objectModelObject)
  2. {
  3. PropertyInfo[]infos=ModelObject.GetType().GetProperties();
  4. object[]CustomerAttributes=null;
  5. object[]CustomerAttributes1=null;
  6. //[email protected]=''[email protected]=''
  7. stringstrSQL="SELECTIDFROM{0}WHERE{1}";
  8. stringstrTablename=PubFuncs.GetTableName(ModelObject);
  9. stringstrWOA="";
  10. stringstrWHERE="";
  11. stringstrFieldMessage="";
  12. foreach(PropertyInfoinfoininfos)
  13. {
  14. CustomerAttributes=info.GetCustomAttributes(typeof(MiniORMAttribute.DataFieldNotDoubleAttribute),false);
  15. CustomerAttributes1=info.GetCustomAttributes(typeof(MiniORMAttribute.DataFieldAttribute),false);
  16. if(CustomerAttributes!=null&&CustomerAttributes1!=null)
  17. {
  18. for(inti=0;i<CustomerAttributes.Length;i++)
  19. {
  20. strWHERE+=strWOA+((MiniORMAttribute.DataFieldAttribute)CustomerAttributes1[0]).FieldName+"='"+info.GetValue(ModelObject,null)+"'";
  21. strFieldMessage+=((MiniORMAttribute.DataFieldAttribute)CustomerAttributes1[0]).FieldName;
  22. strWOA="OR";
  23. }
  24. }
  25. }
  26. //这里需要做strWHERE不为空的判断
  27. if(strWHERE.Trim()!="")
  28. {
  29. strSQL=string.Format(strSQL,newstring[]{strTablename,strWHERE});
  30. using(SqlConnectionconn=newSqlConnection(PubFuncs.ConnectionStr))
  31. {
  32. conn.Open();
  33. SqlCommandcmd=newSqlCommand();
  34. cmd.Connection=conn;
  35. cmd.CommandType=CommandType.Text;
  36. cmd.CommandText=strSQL;
  37. using(SqlDataReaderrdr=cmd.ExecuteReader())
  38. {
  39. if(rdr.Read())
  40. {
  41. thrownewException("下列字段值不能重复:"+strFieldMessage);
  42. }
  43. }
  44. }
  45. }
  46. }

测试代码如下:
首先是类关系图:

C#基础系列:实现自己的ORM(MiniORM的测试代码)

数据库表:

Person表:

C#基础系列:实现自己的ORM(MiniORM的测试代码)

Hand表:

C#基础系列:实现自己的ORM(MiniORM的测试代码)

Head表:

C#基础系列:实现自己的ORM(MiniORM的测试代码)

测试代码如下:

下面是类代码:

  1. [DataObjectAttribute("Person","ID","")]
  2. publicclassPerson
  3. {
  4. privateint_ID;
  5. privatestring_Name;
  6. privateint_Age;
  7. privatestring_Sex;
  8. privateHead_Head;
  9. privateHand_LeftHand;
  10. privateHand_RightHand;
  11. [DataFieldAttribute("ID",true)]
  12. publicintID
  13. {
  14. get{return_ID;}
  15. set{_ID=value;}
  16. }
  17. [SubDataObjectAttribute(SubDataObjectFieldType.Object,"MiniORM","MiniORM","Head")]
  18. publicHeadHead
  19. {
  20. get{return_Head;}
  21. set{_Head=value;}
  22. }
  23. [SubDataObjectAttribute(SubDataObjectFieldType.Object,"MiniORM","MiniORM","Hand")]
  24. publicHandLeftHand
  25. {
  26. get{return_LeftHand;}
  27. set{_LeftHand=value;}
  28. }
  29. [SubDataObjectAttribute(SubDataObjectFieldType.Object,"MiniORM","MiniORM","Hand")]
  30. publicHandRightHand
  31. {
  32. get{return_RightHand;}
  33. set{_RightHand=value;}
  34. }
  35. [DataFieldAttribute("name","NvarChar")]
  36. publicstringName
  37. {
  38. get{returnthis._Name;}
  39. set{this._Name=value;}
  40. }
  41. [DataFieldAttribute("age","int")]
  42. publicintAge
  43. {
  44. get{returnthis._Age;}
  45. set{this._Age=value;}
  46. }
  47. [DataFieldAttribute("sex","NvarChar")]
  48. publicstringSex
  49. {
  50. get{returnthis._Sex;}
  51. set{this._Sex=value;}
  52. }
  53. publicHandHand
  54. {
  55. get
  56. {
  57. thrownewSystem.NotImplementedException();
  58. }
  59. set
  60. {
  61. }
  62. }
  63. publicHeadHead1
  64. {
  65. get
  66. {
  67. thrownewSystem.NotImplementedException();
  68. }
  69. set
  70. {
  71. }
  72. }
  73. }
  74. [DataObjectAttribute("Hand","ID","PersonID")]
  75. publicclassHand
  76. {
  77. privateint_ID;
  78. privateint_PersonID;
  79. privatestring_Name;
  80. [DataFieldAttribute("ID",true)]
  81. publicintID
  82. {
  83. get{returnthis._ID;}
  84. set{this._ID=value;}
  85. }
  86. [DataFieldAttribute("PersonID")]
  87. publicintPersonID
  88. {
  89. get{returnthis._PersonID;}
  90. set{this._PersonID=value;}
  91. }
  92. [DataFieldAttribute("name","NvarChar")]
  93. publicstringName
  94. {
  95. get{return_Name;}
  96. set{_Name=value;}
  97. }
  98. }
  99. [DataObjectAttribute("Head","ID","PersonID")]
  100. publicclassHead
  101. {
  102. privateint_ID;
  103. privateint_PersonID;
  104. privatestring_Name;
  105. [DataFieldAttribute("ID",true)]
  106. publicintID
  107. {
  108. get{returnthis._ID;}
  109. set{this._ID=value;}
  110. }
  111. [DataFieldAttribute("PersonID")]
  112. publicintPersonID
  113. {
  114. get{returnthis._PersonID;}
  115. set{this._PersonID=value;}
  116. }
  117. [DataFieldAttribute("name","NvarChar")]
  118. publicstringName
  119. {
  120. get{return_Name;}
  121. set{_Name=value;}
  122. }
  123. }

下面是测试代码:

  1. [STAThread]
  2. staticvoidMain()
  3. {
  4. //插入测试
  5. WriteTest();
  6. //读取测试
  7. ReadTest();
  8. }
  9. privatestaticvoidWriteTest()
  10. {
  11. Personperson=newPerson();
  12. person.Name="snoopy";
  13. person.Age=5;
  14. person.Sex="male";
  15. Handlefthand=newHand();
  16. lefthand.Name="左手";
  17. Handrighthand=newHand();
  18. righthand.Name="右手";
  19. Headhead=newHead();
  20. head.Name="大笨脑袋";
  21. person.LeftHand=lefthand;
  22. person.RightHand=righthand;
  23. person.Head=head;
  24. MiniORM.OrmWriterwrite=newOrmWriter();
  25. write.Write(person);
  26. }
  27. privatestaticvoidReadTest()
  28. {
  29. MiniORM.OrmReaderreader=newOrmReader();
  30. Personperson=(Person)reader.Read(newPerson(),1);
  31. Console.WriteLine("person.Name:"+person.Name);
  32. Console.WriteLine("person.Age:"+person.Age);
  33. Console.WriteLine("person.Sex:"+person.Sex);
  34. Console.WriteLine("LeftHand.Name:"+person.LeftHand.Name);
  35. Console.WriteLine("RightHand.Name:"+person.RightHand.Name);
  36. Console.WriteLine("Head.Name:"+person.Head.Name);
  37. Console.Read();
  38. }

ReadTest的测试结果如:

C#基础系列:实现自己的ORM(MiniORM的测试代码)

好了,各位,你可以使用这个调试代码来试试了。。。

相关文章:

C#基础系列:实现自己的ORM(ORM的基础概念)

C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)

C#基础系列:实现自己的ORM(构造我自己的ORM)

源代码下载