MiniAccess实现中的一些关键点:

  1. Access对象包含了某个实现了IAccess的提供者对象,而不是从某个实现了IAccess的提供者继承。
  2. AccessBase的作用是委托数据库操作给某个IAccess提供者。

版本说明:

  1. 格式为:n.n.yymmdd
  2. 第一个n:从1开始的一个数字,表示主版本。主版本不保证兼容以前的版本。
  3. 第二个n:从1开始的数字,表示次版本,次版本兼容以前的版本,增加功能但不修改已有功能的接口。
  4. 第三个yymmdd:表示构造日期。

改进列表:

  1. (已完成)增加对无主键的表的支持,此时对不支持的操作抛出异常。
  2. (已完成)2007.4.27增加支持私有属性的映射功能,有时数据库的字段和实体的属性之间存在非常大的类型差异,可以把映射属性设为私有,同时增加一个友好的共有属性。
  3. (已完成)对数据库中可空值的处理,映射时使用引用类型或可空的值类型。在Update和Insert时无需指定参数值,MiniDac自动把可空值DBNull.Value传给数据库。
  4. (已完成)事务处理的支持。
  5. (已完成)添加多记录的处理方法,只添加deletebyconditions,而updatebyconditions实际用途不多,暂且没有添加。
  6. (已完成)2007.5.15: 增加了FindEntity(condition)的功能,用于根据条件在表中搜索出一个实体。条件可以是多表连接或带有自查询。
  7. (已完成)增强增删改查等基本方法的功能,比如异常、执行结果等的更多的信息。
  8. (已完成)区分调试和发布时不同的策略,调试时每次获取映射表都要重新生成储存过程,发布后不再需要生成存储过程。 在appSettings中增加MiniDacMode项,取值为Debug和Release。
  9. (已完成)提升性能,不重复获取映射表和EntityAccessHelper对象。
  10. (已完成)2007.5.15: 全面调整了程序的结构。
    • 原来的存储过程和SQL语句直接根据程序获取的数据库架构来自动生成,现在是先根据架构得到OR映射,然后根据OR表生成SQL语句。
    • 原来GUID字段不可更新,现在不是主键的GUID也可以更新。
    • 优化了SqlServer实现的结构,自动根据需要生成储存过程,在调试模式下始终重新生成存储过程。修改了OR映射部分的数据结构(添加了一些成员),直接根据映射数据就能完成数据库的操作,这样当映射数据不通过获取数据库架构时通过手工填写mdm.xml也能完成数据库的访问。
  11. (已完成)2007.5.15: 使用脚本的方式来管理测试用的数据库。
  12. (已完成)简单书写MiniDac1.1使用说明文档:主要是EntityAccessHelper的API,mdm.xml文件的格式,支持的数据类型和匹配情况。
  13. (已完成)进一步完善mdm.xml文件的处理:mdm.xml架构的验证、mdm.xml文件的定位、mdm.xml文件手动设置和默认值的处理。
    • mdm.xml文件的搜索顺序为:第一在应用程序目录下寻找,第二在应用程序的目录下的minidacmap子目录下寻找,第三在MiniDac.dll所在的目录下寻找,第四在MiniDac.dll所在目录的minidacmap子目录下寻找。一旦找到就不再进一步搜索。应用程序目录指当前线程所在应用程序域的基目录,比如exe所在目录,Web应用的根目录等。
    • OR映射的信息获取方式为,首先根据数据库架构生成映射信息,然后读取mdm.xml文件中的设置,用读取到的数值覆盖自动生成的设置。因此,不必手工填写所有的可选项。
    • 如果在读取mdm.xml文件的过程中发生错误在抛出异常。
  14. (已经完成)2007-11-29:关于配置信息的获取方式:
    • mdm文件的名称确定为程序集的名称后在添加.mdm.xml后缀,比如程序集为TagDataProvider.dll,则mdm文件为TagDataProvider.mdm.xml。
    • 数据库的链接字符串的名称继续保存在mdm文件中。
    • 数据访问方式比如"SqlServer"等,也保存在mdm文件中。如果需要更换数据库,只需要调整mdm文件即可。
  15. (已经完成)2007-10-8:对实现结构进行大的调整,以进一步简化使用代码,并且能可选的实现外键关联,目标是能使CodeSmith生成完整的数据访问层,同时又保留完全手工使用的灵活性。这个版本命名为2.0版,之前的版本为1.0版。
  16. (已经完成)对主键的原始值的保存,用于删除和编辑数据时查找记录。
  17. (已经完成)(2008-10-20)让 Save方法返回int,表示受影响的记录数,现在的返回值是void,除了异常外,不能提供更多的信息。(注意:对于Save中的Update,当实体没有发生变化而没有实际执行SQL时,也要返回整数1,表示程序执行正常,如果不返回1则表示程序没有成功的update。使用部分更新时也需要注意这个问题。)
  18. (已经完成) (2008-10-20)在实体基类中提供直接执行SQL命令的使用函数,对应command中的三个执行方法。目的是需要时在实体类中提供高性能的数据存取方法。
  19. (已经完成)支持对nvarchar和vbinary的(Max)的支持。Max长度的字段的Length在元数据中取出的值是-1,这时需要判断为max。
  20. (已经完成)condition在存储过程中的声明长度为800字符,对于某些字段较多的表来说是不够的(比如在memebership表就碰到了),改为2000字符。

Bugs列表:

  1. (已经修正)2007.4.23发现一个Bug:表名和关键字冲突时不能自动加上[], 因而发生错误。比如使用Option作为表名将会发生错误。
  2. (已经修正)2007.4.26发现一个bug:如果表中没有可更新的字段,则生成Update是错误的。正确的做法是修改为不能使用Update函数,因为此时已经不再生成Update语句。
  3. (已经修正)2007.5.12发现一个bug:当不可更新的字段位于表字段列表的最后一个时Update失败。需要修改循环算法。
  4. (已经修正)2007.5.15发现一个bug:原来在Select时不能使用多表连接,原因是字段列表不能表明是哪个表的字段,现在字段列表增加了表名,可以使用多表连接的查询了。
  5. (已经修正)2007.7.27发现一个bug:当有复合主键的时候,不能正常地Update更新。
    • 2008-10-26:在RuandaoFoundation中rolemapping表中发现,如果系统中除了复合主键之外没有任何其它字段时,有异常提示(“没有可更新字段”),具体原因尚未查清,但是对这种情况如果不需要Update则可以把复合主键改为唯一索引,如果需要Update则需要增加一个自增的主键,这两种方法总是可以解决问题。
  6. (已经修正)2007.9.13发现一个bug:使用EntityAccessHelper<...>.GetInstance()函数时,给定映射文件名时如果不带“.mdm.xml”会出错。
  7. (已经修正)2008.1.18发现bug:插入后继续保存时不能保存修改后的数据,原因是插入后实体的键值没有保存到oldXxxx中,修改为在Insert后,调用SaveOldKeyValue();
  8. (已经修正)2008-3-13发现搜索mdm.xml文件缺陷,不能在App.exe或者WebApplication的~\目录下找到mdm文件。

后续需要完成的工作

  1. 属性名字和字段名字不匹配的错误不容易调试,修改异常的提示信息,以便于发现这类型的错误。
  2. 仅更新部分修改过的字段的功能
    • 和字段对应的私有变量统一集中存放到一个哈希表中。
    • 根据日期戳进行并发控制,在Update和Delete中提供并发性的控制。
  3. 改进设想:目的之一是有效的使用数据库自身提供的功能,之二是简化程序结构从而提高可靠性。

    • 数据访问的繁琐在于执行一个SQL语句之前和之后管道代码,难度不在于书写Sql语句本身,企图让程序员不用书写SQL语句的解决方案必然带来巨大的性能代价,也必然会导致解决方案本身的复杂性,进而带来学习成本,这就是目前Hibernate之类的解决方案的不足之处。
    • MiniAccess的核心就是简化和消除程序中调用SQL语句之前和之后的管道代码,但绝不是代替程序员书写SQL语句。
    • 把存储过程的建立等功能开放出来,让程序员直接在代码中管理。
    • 执行一个SQL语句之前的参数准备应该像调用一个C#函数一样简单和直观。
    • 执行完SQL语句之后的结果数据应该能自动的传递到对象之中。
    • 目前提供的增删改查等核心功能不再是MiniAccess的核心架构,而是MiniAccess核心上的用。MiniAccess的核心只是提供一个简化SQL调用的数据访问类。这需要改写现有的增删改查的实现。 <!--EndFragment-->