更新NuGet
VS2010自带了NuGet,但是版本可能不是最新的(我的就不是)。 首先把NuGet升级到最新版本。
打开《扩展管理器》
在左侧的手风琴菜单中选中《更新》
如上图,这种情况就是需要更新《NuGet Package Manager》。 如果没有出现,则说明你的《NuGet》已经是最新的了(前提是你是VS2010),直接进入下一章吧。
点击《更新》,然后按操作进行就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命令行。
依次打开《工具》《库程序包管理器》《程序包管理器控制台》
敲入命令对可用的版本进行查询get-package –listavailable –allversion –filter petapoco,如图
我要使用的是petapoco 4.0.3这一个,如图
敲入命令进行安装install-package petapoco –version 4.0.3,如图
中间弹出对话框,直接确定,如果之后报错直接无视就行了。
将当前焦点窗口转移回控制台。如下图输出,表示安装成功。
上图中的《acoms》是我当前的项目,安装的时候默认要有一个打开的项目的Web的桌面的都可以。
PetaPoco的安装结束。
配置PetaPoco
现在又遇到一个问题,使用Ctrl+Shift+B编译项目的时候报错,说dynamic神马的不存在。
这是因为Dynamic也是.net4.0的。PetaPoco官方提供了一个编译时的选项来开启&关闭对dynamic的支持。
下面来进行编译选项的设置:
在项目上《右键》《属性》
选择左侧tab的第二项《生成》,在《条件编译符号》中输入PETAPOCO_NO_DYNAMIC
保存,再次Ctrl+Shift+B,进行编译。这次就OK了。
配置PetaPoco T4模板
我用PetaPoco是为了操作数据库方便,能自动生成与数据库表一一对应的Model当然更方便了。 我使用的数据库是mysql,以下示例为针对mysql的版本,其他版本自行修改相应配置。
数据库名:ptest
数据表两张:porder,puser
在程序的配置文件(web.config或app.config)中增加节点类似
然后打开Database.tt文件
进行如图修改(其中的SchemaName是原来没有,新增的,并且是必填的,其他几个随意)
保存文件。选中《Database.tt》《右键》《运行自定义工具》如图,如果弹窗,则确定。
运行结束后输出信息如下(0个错误,警告无视之)。
此时查看Database.cs
自动生成了5个类: porder,puser是和我的数据库表对应的。DBUtils,IFactory,Record这三个是工具类。
搞定。下一步是是怎么使用这些代码了。
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 {
[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 {
[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;
}
增删改查
增加 var db = DBUtils.GetInstance();
db.BeginTransaction();
puser a = new puser();
a.username = "first user";
a.password = "first password";
a.email = "first@first.com";
a.createtime = DateTime.Now;
db.Insert(a); //a.Insert(); [/csharp]
删除 db.Execute("delete from puser");
db.Execute("delete from porder");
事务(mysql要使用InnoDB) var db = DBUtils.GetInstance();
db.BeginTransaction();
try {
// operations
db.CompleteTransaction();
}
catch (Exception e) {
db.AbortTransaction();
Console.WriteLine(e.StackTrace);
}
使用部分类扩展model
为puser增加一个额外的属性myorder namespace models {
public partial class puser {
public porder myorder { set; get; }
}
}
使某些属性不参与ORM [PetaPoco.Ignore]
public porder myorder {
set;
get;
}
获取单个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);
}
获取多个model
同时获取puser和poder对象,先使用上述3,4,给puser增加myorder属性。 foreach (puser one in
db.Query ("select * from puser left join porder on email=ordername ")) {
Console.WriteLine("{0} - {1} - {2}",one.username,one.password,one.myorder.ordername);
}