PetaPoco初体验

更新NuGet

VS2010自带了NuGet,但是版本可能不是最新的(我的就不是)。 首先把NuGet升级到最新版本。

  1. 打开《扩展管理器》
  2. 在左侧的手风琴菜单中选中《更新》
    更新
  3. 如上图,这种情况就是需要更新《NuGet Package Manager》。 如果没有出现,则说明你的《NuGet》已经是最新的了(前提是你是VS2010),直接进入下一章吧。
  4. 点击《更新》,然后按操作进行就ok了。

安装PetaPoco 4.0.3

PetaPoco C#微型ORM框架,基本无需配置,仅由单个cs文件构成,支持.net3.5 .net4.0。
官方还出品了配套的T4模板用来自动生成数据库Models。 官方网站
截稿时PetaPoco的官方最新版本为5.0.1。我不采用5.0.1版本,因为我用的是.net3.5,而5.0.1的版本中用到了一个类System.Tuple,这个类是从.net4.0才开始有的。(当然也可以自己实现这个类,不过像我这样的初学者还是算了吧)。
经过google我决定使用4.0.3的版本。 这时遇到了一个问题:
NuGet图形界面中默认列出的只有最新版本,一装就是5.0.1。
再次google,找到《NuGet 安装旧版本库》的方法。那就是使用NuGet命令行。

  1. 依次打开《工具》《库程序包管理器》《程序包管理器控制台》
    包管理器
  2. 敲入命令对可用的版本进行查询get-package –listavailable –allversion –filter petapoco,如图
    版本查询
  3. 我要使用的是petapoco 4.0.3这一个,如图
    4.0.3
  4. 敲入命令进行安装install-package petapoco –version 4.0.3,如图
    中间弹出对话框,直接确定,如果之后报错直接无视就行了。
    安装
  5. 将当前焦点窗口转移回控制台。如下图输出,表示安装成功。
    成功
  6. 上图中的《acoms》是我当前的项目,安装的时候默认要有一个打开的项目的Web的桌面的都可以。
  7. PetaPoco的安装结束。

配置PetaPoco

现在又遇到一个问题,使用Ctrl+Shift+B编译项目的时候报错,说dynamic神马的不存在。
dynamic不存在
这是因为Dynamic也是.net4.0的。PetaPoco官方提供了一个编译时的选项来开启&关闭dynamic的支持。
下面来进行编译选项的设置:

  1. 在项目上《右键》《属性》
  2. 选择左侧tab的第二项《生成》,在《条件编译符号》中输入PETAPOCO_NO_DYNAMIC
    条件编译符号
  3. 保存,再次Ctrl+Shift+B,进行编译。这次就OK了。

配置PetaPoco T4模板

我用PetaPoco是为了操作数据库方便,能自动生成与数据库表一一对应的Model当然更方便了。 我使用的数据库是mysql,以下示例为针对mysql的版本,其他版本自行修改相应配置。

  • 数据库名:ptest

  • 数据表两张:porder,puser

  • 在程序的配置文件(web.configapp.config)中增加节点类似

    <connectionStrings>
        <add name="MySqlconnstr" connectionString="server=127.0.0.1;User Id=root;password=root;Persist Security Info=True;database=ptest;Charset=utf8" providerName="MySql.Data.MySqlClient"/>
    </connectionStrings>
    
  • 然后打开Database.tt文件
    database.tt

  • 进行如图修改(其中的SchemaName是原来没有,新增的,并且是必填的,其他几个随意)
    修改

  • 保存文件。选中《Database.tt》《右键》《运行自定义工具》如图,如果弹窗,则确定。
    弹窗

  • 运行结束后输出信息如下(0个错误,警告无视之)。
    结束

  • 此时查看Database.cs
    database.cs
    自动生成了5个类: porderpuser是和我的数据库表对应的。DBUtilsIFactoryRecord<T>这三个是工具类。

  • 搞定。下一步是是怎么使用这些代码了。

PetaPoco使用示例

以下代码是针对由上述T4模板生成的model进行的。自己定义的model可能不具备其中的一些方法。

Porder数据表及类属性如下

CREATE TABLE `porder` ( 
    order_id int(11) NOT NULL auto_increment, 
    totalprice varchar(20) NOT NULL, 
    coupons varchar(20) default NULL, 
    ordername varchar(20) NOT null, 
    createtime datetime NOT NULL, 
    PRIMARY KEY (order_id) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 


[TableName("porder")] 
[PrimaryKey("order_id")] 
[ExplicitColumns] 
public partial class porder : DBUtils.Record<porder> { 

    [Column] 
    public int order_id { 
        get { return _order_id; } 
        set { _order_id = value; MarkColumnModified("order_id"); } 
    } 
    int _order_id; 

    [Column] 
    public string totalprice { 
        get { return _totalprice; } 
        set { _totalprice = value; MarkColumnModified("totalprice"); } 
    } 
    string _totalprice; 

    [Column] 
    public string coupons { 
        get { return _coupons; } 
        set { _coupons = value; MarkColumnModified("coupons"); } 
    } 
    string _coupons; 

    [Column] 
    public string ordername { 
        get { return _ordername; } 
        set { _ordername = value; MarkColumnModified("ordername"); } 
    } 
    string _ordername; 
    [Column] 
    public DateTime createtime { 
        get { return _createtime; } 
        set { _createtime = value; MarkColumnModified("createtime"); } 
    } 
    DateTime _createtime; 
} 

Puser数据库表及类属性如下

    CREATE TABLE puser ( 
        user_id int(11) NOT NULL auto_increment, 
        username varchar(20) NOT NULL, 
        password varchar(20) NOT NULL, 
        email varchar(50) NOT NULL, 
        createtime datetime NOT NULL, 
        PRIMARY KEY (user_id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

    [TableName("puser")] 
    [PrimaryKey("user_id")] 
    [ExplicitColumns] 
    public partial class puser : DBUtils.Record<puser> { 
        [Column] 
        public int user_id { 
            get { return _user_id; } 
            set { _user_id = value; MarkColumnModified("user_id"); } 
        } 
        int _user_id; 

        [Column] public string username { 
            get { return _username; } 
            set { _username = value; MarkColumnModified("username"); } 
        } 
        string _username; 

        [Column] 
        public string password { 
            get { return _password; } 
            set { _password = value; MarkColumnModified("password"); } 
        } 
        string _password; 

        [Column] 
        public string email { 
            get { return _email; } 
            set { _email = value; MarkColumnModified("email"); } 
        } 
        tring _email; 

        [Column] 
        public DateTime createtime { 
            get { return _createtime; } 
            set { _createtime = value; MarkColumnModified("createtime"); } 
        } 
        DateTime _createtime; 
    } 
  1. 增删改查

    • 增加

      var db = DBUtils.GetInstance(); 
      db.BeginTransaction(); 
      puser a = new puser(); 
      a.username = "first user"; 
      a.password = "first password"; 
      a.email = "[email protected]"; 
      a.createtime = DateTime.Now; 
      db.Insert(a); //a.Insert(); [/csharp] 
      
    • 删除

      db.Execute("delete from puser"); 
      db.Execute("delete from porder"); 
      
  2. 事务(mysql要使用InnoDB)

    var db = DBUtils.GetInstance(); 
    db.BeginTransaction(); 
    try { 
        // operations 
        db.CompleteTransaction(); 
    } 
    catch (Exception e) { 
        db.AbortTransaction(); 
        Console.WriteLine(e.StackTrace); 
    } 
    
  3. 使用部分类扩展model

    • 为puser增加一个额外的属性myorder

      namespace models { 
          public partial class puser { 
              public porder myorder { set; get; } 
          } 
      } 
      
  4. 使某些属性不参与ORM

    [PetaPoco.Ignore] 
    public porder myorder { 
        set; 
        get; 
    } 
    
  5. 获取单个model

    • 获取单个long值

      long count = db.ExecuteScalar("SELECT Count(*) FROM puser"); 
      Console.WriteLine("puser count " + count); 
      
    • 获取puser列表

      foreach (puser one in db.Query ("select * from puser")) { 
          Console.WriteLine("{0} - {1} - {2}", one.user_id, one.username, one.password); 
      } 
      Console.WriteLine("-----------------"); 
      foreach (var one in db.Query ("select * from porder")) { 
          Console.WriteLine("{0} - {1} - {2}", one.order_id, one.ordername, one.totalprice); 
      } 
      
  6. 获取多个model

    • 同时获取puser和poder对象,先使用上述3,4,给puser增加myorder属性。

      foreach (puser one in 
          db.Query <puser,porder>("select * from puser left join porder on email=ordername ")) { 
          Console.WriteLine("{0} - {1} - {2}",one.username,one.password,one.myorder.ordername); 
      }
      

你可能感兴趣的:(C#,PetaPOCO)