Getting Started

菜鸟入门

Beginner:How to use Entity Framework? SOS!
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. It Still support .NET 2.0,and The memory use is tiny.

一直使用EF并且老是遇到麻烦?何不解放自己并且试试SOD框架呢!
它是简单的,容易使用的,轻量级的框架,并且仍然支持.NET 2.0,只需极小的内存即可运行。

SOD not only a ORM framework,include SQL-MAP,DataControls,detai ,but it is a light weight framework . see this page.

SOD 不仅仅是一个ORM框架,还包括 SQL-MAP,DataControls,但它却是一个非常轻量级的框架。了解更多,看这里。


Learning more,see this page.

要了解更多,请看这篇文章


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

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

1,首先建立一个实体类:

   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); } 
       } 
    } 
  • 这个User实体类将映射到一个名字为“Tb_User”的表,并且映射一个名字为UserID的主键,同时,UserID字段也是表的“标识”字段(IdentityName属性),对SOD框架而言,实体类的标识字段在Oracle,MySQL等所有非SqlServer上表现的特性是一致的,即字段都有自增功能。
  • 实体类的属性方法内部调用了 getProperty和 setProperty方法,来获取或者设置属性对应的数据库字段值,我们称这样的属性为 “持久化属性”,用来跟类的普通属性相区别。对于字符串属性而言,setProperty方法还可以指定映射的字段的长度,这对于执行查询的时候获得稳定的查询计划很重要

2,然后建立一个 DbContext:

  class  LocalDbContext:DbContext 
   { 
       public LocalDbContext() 
           : base("local") 
       { 
           //local 是连接字符串名字 
       } 
  
       protected  override bool CheckAllTableExists() 
       { 
           //创建用户表 
           CheckTableExists<User>(); 
           return  true; 
       } 
   }
 

3,修改下App.config 文件的连接配置:

<?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框架提供的驱动程序,可选的内容有:
  1. Access
  2. SqlServer
  3. Oracle
  4. SqlCe
  5. OleDb
  6. Odbc

如果是其它的扩展程序集,那么providerName应该写成下面的形式:
    providerName="PWMIS.DataProvider.Data.OracleDataAccess.Oracle,PWMIS.OracleClient"

其中,“,”号前是驱动程序类型的全名称, “,”号后是驱动程序所在的程序集名称,要求该程序集必须放到 跟PWMIS.Core.dll 同一个目录下,且是同一个兼容版本。
有关数据库连接配置的详细内容,请参考:2.2.3 扩展数据访问类配置

4,然后,像下面这样使用,如果连接的数据库没有数据库或者表,可自动创建数据库和表:

           //创建数据库和表
           LocalDbContext context=new  LocalDbContext();

上面确定“用户表”已经存在了,可以写SQL语句查询和删除之前的测试数据:
 AdoHelper db=MyDB.GetDBHelperByConnectionName("local");//local是配置的连接字符串名字
 //格式化查询
 var userList=db.ExecuteMapper("SELECT UserId,Name FROM Table_User WHERE Name={0}","zhang san")
    .MapToList(reader => new
               {
                  UID = reader.GetInt32(0),
                  Name = reader.GetString(1)
              });
 //删除数据
 int count= db.ExecuteNonQuery("delete from Tb_User where Name='zhang san'");

上面的查询方式类似于流行的Dapper方式,但性能更高,它直接利用了DataReader,无任何性能损失
另外,也可以使用ORM的方式来删除和添加数据,如下示例:

          //重新指定主键,删除旧的测试数据 
           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 方式插入数据 
  

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

5,最后,像下面这样使用查询即可:

 
           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>(); 


实际上,框架提供了至少6种查询方式,详细内容,请看Demo程序下载,看这里

附注:


       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支持


Last edited Aug 12 at 3:17 PM by dth, version 74