更新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
)中增加节点类似<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
文件 -
进行如图修改(其中的
SchemaName
是原来没有,新增的,并且是必填的,其他几个随意) -
保存文件。选中《Database.tt》《右键》《运行自定义工具》如图,如果弹窗,则确定。
-
运行结束后输出信息如下(0个错误,警告无视之)。
-
此时查看Database.cs
自动生成了5个类:porder
,puser
是和我的数据库表对应的。DBUtils
,IFactory
,Record<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;
}
-
增删改查
-
增加
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 <puser,porder>("select * from puser left join porder on email=ordername ")) { Console.WriteLine("{0} - {1} - {2}",one.username,one.password,one.myorder.ordername); }
-
来源:oschina
链接:https://my.oschina.net/u/1158462/blog/290494