当前页面内容同步自 https://github.com/znlgis/sod   PDF.NET官网


菜鸟:“怎么使用EF(Entity Framework)框架啊?遇到麻烦了,救命!”

Beginner:"How to use Entity Framework? SOS!"

老鸟:“试试SOD开发框架!”

Senior men:"Try using the SOD Framework!"

一直使用EF并且老是遇到麻烦?何不解放自己并且试试SOD框架呢! 它是简单的,并且容易使用的,轻量级的框架。

Still using EF and get stuck? Why not release yourself and try SOD! It is easy, and simple.


1,为什么需要SOD框架 --Why Need the SOD Frmaework?

EF框架或大部分ORM框架的缺点就是SOD框架的优点,它拥有超过15年的项目应用历史,为你而生!

The disadvantage of Entity Framework or most ORM frameworks is the advantage of SOD framework,It has more than 15 years of project application history, born for you!

SOD 不止是一个ORM框架,还包括 SQL-MAP,DataControls,但它却是一个非常轻量级的框架,也是一个企业级数据应用开发的解决方案。 了解更多,看这里

SOD not only a ORM framework,include SQL-MAP,DataControls,detai ,but it is a light weight framework,and also it is an enterprise level data application development solution . see [this page] (http://www.pwmis.com/sqlmap)


Begin 2006-06-06

SOD框架特别适合于以下类型的企业项目:

The SOD framework is particularly suitable for the following types of enterprise projects:

  1. 对数据操作安全有严格要求的金融行业;--Financial industry with strict requirements for data operation security
  2. 对数据访问速度、内存和CPU资源有苛刻要求的互联网行业;--Internet industry with stringent requirements for data access speed, memory and CPU resources
  3. 对需求常常变化,项目经常迭代,要求快速开发上线的项目;--Requirements often change, projects often iterate, requiring rapid development of online projects
  4. 对稳定性要求高,需要长期维护的企业级应用如MIS、ERP、MES等行业;--Enterprise applications requiring high stability and long-term maintenance, such as MIS, ERP, MES and other industries
  5. 需要低成本开发,人员技能偏低的中小型项目。 --Small and medium-sized projects requiring low-cost development and low personnel skills

SOD框架是少数仍然支持 .NET 2.0的框架,当然,它也支持 .NET 3.x,.NET 4.x,以及.Net core 和马上到来的.NET 5 。

The SOD framework is one of the few that still supports. Net 2.0. Of course, it also supports. Net 3. X,. Net 4. X, as well as. Net core and. Net 5.

2,功能特性 --functional and features

SOD框架由PDF.NET框架发展而来,它包括以下功能:

The SOD framework contains the following functional features:

核心三大功能 --Main purpose(S,O,D):

SQL-MAP

XML SQL config and Map DAL  --基于XML配置的SQL查询和数据访问层映射
  SQL Map Entity              --SQL语句映射为实体类
  

ORM

OQL(ORM Query Language)      --ORM查询语言:OQL 
  Data Container               --数据容器
  Entity Indexer               --实体类索引器访问
  Table Map route Query        --分表查询支持
  Micro ORM                    --微型ORM
  

Data Controls

Consistent Data Froms        --一致的数据窗体访问技术
  WebForm Data Controls        --Web窗体数据控件
  WinForm Data Controls        --Windows窗体数据控件
  

有用的功能组件:

Hot Use Cache               --热缓存(缓存最常用的数据)
  Binary Serialization        --二进制序列化
  Query Log                   --查询日志
  Command Pipeline            --命令管道
  Distributed Identification  --分布式ID
  

企业级解决方案:

MVVM (Web/WinForm)               --MVVM数据窗体
  Memory Database                  --内存数据库
  Transaction Log Data Replication --事务日志数据复制
  Data Synchronization             --数据同步
  Distributed transaction          --分布式事务
  OData Client                     --OData 客户端
  

工具:

Integrated Development Tool     --集成开发工具,包括实体类生成、SQL-MAP代码自动生成和多种数据库访问工具。
  Nuget support                   --Nuget 支持
  

源码和社区:

Code: https://github.com/znlgis/sod or https://gitee.com/znlgis/sod
  Home: http://www.pwmis.com/sqlmap
  Blog: https://www.cnblogs.com/bluedoctor
  QQ Group:18215717,154224970
  

Learning more,see this page.

要了解更多,请看这篇文章:.NET ORM 的 “SOD蜜”--零基础入门篇 或者参考框架作者编著的图书: SOD框架企业级应用数据架构实战

3,ORM简单示例 --use ORM Simple example

下面一个简单的SOD框架ORM使用的实例: 在开始工作之前,先建立一个控制台项目,然后在程序包管理控制台,添加SOD框架的Nuget 包:

Install-Package PDF.NET.SOD 
  

这样即可获取到最新的SOD框架包并且添加引用,然后,就可以开始下面的工作了。 已经建立好的当前Demo程序下载,看这里

  public  class User : EntityBase 
    { 
        public User() 
        { 
            TableName = "Tb_User"; 
            IdentityName = "UserID"; 
            PrimaryKeys.Add("UserID"); 
       } 
   
        public  int ID 
        { 
            get { return getProperty<int>("UserID"); } 
            set { setProperty("UserID", value); } 
        } 
   
        public  string Name 
        { 
            get { return getProperty<string>("Name"); } 
            set { setProperty("Name", value, 50); } 
        } 
   
        public  string Pwd 
        { 
            get { return getProperty<string>("Pwd"); } 
            set { setProperty("Pwd", value, 50); } 
        } 
     } 
  class  LocalDbContext:DbContext 
     { 
         public LocalDbContext() 
             : base("local") 
         { 
             //local 是连接字符串名字 
         } 
    
         protected  override bool CheckAllTableExists() 
         { 
             //创建用户表 
             CheckTableExists<User>(); 
             return  true; 
         } 
     }
   

注意:这一步骤只是为了 code first ,如果表事先已经存在,可以略去本步骤,当然下面的代码会有所调整。

<?xml version="1.0" encoding="utf-8" ?> 
  <configuration> 
  <connectionStrings> 
     <add name="local" connectionString="Data Source=.;database=TestDB; Integrated Security=True" providerName="SqlServer"/> 
  </connectionStrings> 
  </configuration> 

providerName 是SOD框架的数据访问提供程序,PWMIS.Core.dll内置的可选简略名称有:Access | SqlServer | Oracle | SqlCe | OleDb | Odbc

在其它提供程序中,SOD框架提供了对 MySQL/Oracle/PostgreSQL/SQLite 等常见数据库的支持(扩展程序集),只要数据库提供了ADO.Net驱动程序,那么SOD框架经过简单包装即可保证支持。

如果是其它的扩展程序集,那么providerName应该写成下面的形式:

providerName="<提供程序类全名称>,<提供程序类所在程序集>"

比如使用SOD封装过的Oracle官方的ADO.NET提供程序类:

    providerName="PWMIS.DataProvider.Data.OracleDataAccess.Oracle,PWMIS.OracleClient"

注意:提供程序程序集必须放到 跟PWMIS.Core.dll 同一个目录下,且是同一个兼容版本。 有关数据库连接配置的详细内容,请参考作者图书:《SOD框架企业级应用架构实战》。

           //创建数据库和表
             LocalDbContext context=new  LocalDbContext();
            //重新指定主键,删除旧的测试数据 
             User oldUser = new  User(); 
             oldUser.PrimaryKeys.Clear(); 
             oldUser.PrimaryKeys.Add("Name"); 
             oldUser["Name"] = "zhang san"; //索引器使用 
             int count= context.Remove<User>(oldUser); 
    
             User zhang_san = new  User() { Name = "zhang san", Pwd = "123" }; 
             count = context.Add<User>(zhang_san);//采用 DbContext 方式插入数据 
    

当然插入数据的方式很多,具体请看本文提供的源码下载。

 
             User user = new  User() { Name = "zhang san" }; 
             OQL q = OQL.From(user) 
               .Select() 
               .Where(user.Name) 
             .END; 
    
             PrintOQL(q); 
             List<User> users = EntityQuery<User>.QueryList(q); 
  

这种方式适合简单的相等条件查询,如果需要复杂的条件,可以修改成下面这个样子:

           //示例:采用操作符重载写比较条件 
             User user = new  User(); 
             OQL q = OQL.From(user) 
                           .Select() 
                           .Where(cmp => cmp.Property(user.Name) == "zhang san") 
                         .END; 
           PrintOQL(q); 
             //使用扩展方法 using PWMIS.Core.Extensions; 
             List<User> users = q.ToList<User>();
  

示例代码中的 可以修改成 >,<,like 等SQL支持的比较符号。 如果需要更多条件,可以使用 &表示SQL的AND,| 表示 SQL的OR 逻辑关系,比如:

           //示例:采用操作符重载写比较条件 
             User user = new  User(); 
             OQL q = OQL.From(user) 
                           .Select() 
                           .Where(cmp => cmp.Property(user.Name) == "zhang san" 
                           & cmp.Comparer(user.Pwd ,"=","123") ) 
                         .END; 
           PrintOQL(q); 
             //使用扩展方法 using PWMIS.Core.Extensions; 
             List<User> users = q.ToList<User>(); 

实际上,框架提供了至少8种查询方式,详细内容,请看.NET ORM 的 “SOD蜜”--零基础入门篇

附注:

       private static void PrintOQL(OQL q)
         { 
             Console.WriteLine("OQL to SQL:\r\n{0}", q.ToString()); 
             Console.WriteLine("SQL Parameters:\r\n{0}", q.PrintParameterInfo()); 
         } 
  

该方法可以打印OQL的SQL和参数信息,为你调试代码带来方便。


这样,一个简单的ORM使用实例就做好了。上面这段ORM例子,不仅仅适用于Oracle,使用在其它数据库都是可以得,只需要修改 连接字符串配置的 providerName和 connectionString 即可。

详细可以参考 [Oracle 免费的数据库--Database 快捷版 11g 安装使用与"SOD框架"对Oracle的CodeFirst支持] (http://www.cnblogs.com/bluedoctor/p/4359878.html)

附注: OQL也可以支持复杂的多表联合查询,如下面的例子:

OQL q=OQL.From(entity1)
          .Join(entity2).On(entity1.PK,entity2.FK)
          //.Select(entity1.Field1,entity2.Field2) //不再需要指定查询的属性
          .Select()
       .End;
  EntityContainer ec=new EntityContainer(q);
  var list=ec.MapToList(()=>
          {
             return new {
                          Property1=entity1.Field1, 
                          Property2=entity2.Field2 
                        };
          });
  
  foreache(var item in list)
  {
     Console.WriteLine("Property1={0},Property2={1}",item.Property1,item.Property2);
  }
  

有关OQL的高级用法和详细示例,请参考这篇文章和它的系列链接:ORM查询语言(OQL)简介--实例篇

4,其它

Thank you for your donation 欢迎您捐助本项目,捐赠地址:框架官网