`
saybody
  • 浏览: 902944 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

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. //SELECTIDFROMTableNameWHERE@A=''OR@B=''
  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. }

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

数据库表:

Person表:

Hand表:

Head表:

测试代码如下:

下面是类代码:

  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(ORM的基础概念)

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

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

源代码下载

分享到:
评论

相关推荐

    C#实现自己的ORM系列源码(MiniORM).rar

    本资源“C#实现自己的ORM系列源码(MiniORM).rar”提供了这样一个学习和实践的机会。它包含了一个名为MiniORM的简单ORM框架的源代码,以及一个解决方案文件MiniORM.sln,用于在Visual Studio中编译和运行项目。此外,...

    基于C#实现的轻量级ORM类库源代码

    ORM,全称Object-Relational Mapping,即对象关系映射,是一种编程技术...通过对这个轻量级ORM类库源代码的学习,开发者不仅可以提升自己的C#技能,还能深入理解ORM的工作原理,为实际项目开发中的数据库操作提供便利。

    实现自己的ORM系列源码 - MiniORM

    这是我Blog(http://blog.csdn.net/RonoTian)中的系列文章《实现自己的ORM》系列的配套资源,如果你需要详细的了解MiniORM的相关实现,那请自己查看我Blog中相关文章。

    C#项目实例: 项目测试分配系统

    【C#项目实例: 项目测试分配系统】 在软件开发过程中,测试是至关重要的环节,它确保了产品的质量和稳定性。本项目是一个C#编写的项目测试分配系统,旨在帮助毕业设计的学生以及专业程序员进行有效、有序的测试工作...

    spring-orm-5.0.8.RELEASE-API文档-中英对照版.zip

    Maven坐标:org.springframework:spring-orm:5.0.8.RELEASE; 标签:springframework、spring、orm、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档...

    C# ORM程序及实体生成工具

    标题提到的"C# ORM程序"是指基于C#语言实现的ORM框架,它可能包含一系列类库和工具,用于与多种类型的数据库(MySQL, SQLite, SQLServer, Oracle, Access)进行交互。ORM工具的核心功能包括但不限于数据查询、事务...

    c#SqliteORM看名称你懂的

    标题中的"C# Sqlite ORM"指的是使用C#编程语言实现的SQLite对象关系映射(ORM)框架。ORM是一种编程技术,它允许开发者使用面向对象的方式来操作数据库,而无需关心底层SQL语句。SQLite是一个轻量级的关系型数据库...

    spring-orm-4.2.2.RELEASE-API文档-中文版.zip

    Maven坐标:org.springframework:spring-orm:4.2.2.RELEASE; 标签:springframework、spring、orm、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 ...

    spring-orm-5.0.8.RELEASE-API文档-中文版.zip

    Maven坐标:org.springframework:spring-orm:5.0.8.RELEASE; 标签:springframework、spring、orm、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 ...

    .net ORM实现代码

    .NET ORM实现代码主要涉及到的对象关系映射(Object-Relational Mapping,简称ORM)技术,这是一种在软件开发中用于简化数据库操作的技术。ORM框架允许开发者使用面向对象的方式与数据库进行交互,而无需直接编写SQL...

    轻松实现Grove.ORM

    5. **查询语法**:Grove.ORM可能提供了类似于Linq-to-Entities的查询方式,允许你用C#代码编写查询,然后自动转换为SQL执行。理解如何使用Lambda表达式进行复杂查询和过滤。 6. **事务处理**:了解如何在Grove.ORM...

    spring-orm-4.2.2.RELEASE-API文档-中英对照版.zip

    Maven坐标:org.springframework:spring-orm:4.2.2.RELEASE; 标签:springframework、spring、orm、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档...

    C#代码生成器源码-基于自定义ORM框架

    总结,这款基于C#的代码生成器,通过结合SQLServer数据库和自定义ORM框架,实现了高效、灵活的代码生成,极大地提升了开发效率。开发者在实际使用中,可以根据自身项目的特性和需求,对源码进行调整和扩展,以满足...

    一款简单实用的ORM(C#)

    在C#中,ORM框架可以帮助开发者无需编写大量的SQL语句,就能实现对数据库的操作,极大地提高了开发效率。这款ORM工具显然是针对SQL数据库设计的,其轻量级特性意味着它可能更注重易用性和性能,而不是提供复杂的企业...

    ORM框架-VB/C#.Net实体代码生成工具(EntitysCodeGenerate)ECG4.3.pdf

    2.1 ORM框架的实现:VB/C#.Net实体代码生成工具(EntitysCodeGenerate) 4 2.2 在开发中的实际应用 5 2.2.1 单个实体对象的数据库操作 6 1、获取一个实体对象信息 6 2、插入一个实体对象信息 6 3、更新一个实体对象...

    自己写的ORM

    在.NET框架下,AdoNet是微软提供的一套用于访问数据库的标准API,而ORM则是在此基础上进行抽象,帮助开发者避免直接编写SQL语句,提高开发效率和代码可维护性。 自定义ORM框架的设计通常包括以下几个关键部分: 1....

    ORM-Dapper+DapperExtensions 示例全代码

    Dapper是一款轻量级、高性能的SQL查询库,而DapperExtensions则在Dapper的基础上提供了一种更方便的ORM(对象关系映射)方式,使得开发者无需手动编写SQL语句,就能实现对数据库的操作。 Dapper本身是一个简单的SQL...

    C#轻量级通用最基础ORM,支持多数据库

    最最最最最最基础的操作数据库增删改查,支持事务,通用类,理论上支持MsSql,Oracle,OleDb,MySql,...(由于后两种需要额外引入相关Dll,因此本类中不包含实现,自己添加即可。) 本类只是提供一种思路,可以参考。

    C#发现之旅:使用反射和特性构造自己的ORM框架实用.pdf

    总结来说,ORM框架是为了解决关系型数据库与面向对象编程之间的不匹配问题,反射和特性是C#中实现ORM的关键工具。反射提供运行时的类型信息和动态操作,特性则作为对象与数据库映射的标记。通过学习和应用这两者,...

Global site tag (gtag.js) - Google Analytics