词条统计
浏览次数:10761 次
编辑次数:15次 历史版本
最近更新:2013/7/16
创建者:掷鸡蛋者

【补充1:《ORM使用过程中的常见问题和说明》在 http://www.wojilu.com/Forum1/Topic/152 】

【补充2:wojilu ORM 支持垂直分库(比如可以将某些表放在数据库a,某些表放在数据库b中……),具体做法见本文末尾说明。】

wojilu ORM 尽量设计得简单易用,从下图可以看出,总共也就9个方法(重载方法不算)。

下面举一些例子来演示:

findById

Article article = Article.findById( 2 );

findAll

List<Article> list = Article.findAll();

find

说明:本方法最强大,一般的查询、搜索都使用本方法。

List<Article> list = Article.find( "Title=:t and IsDelete=:isdel" )
    .set( "t", "" )
    .set( "isdel", 1 )
    .list();

List<Article> list = Article.find( "Title=:t and IsDelete=:isdel" )
    .set( "t", "" )
    .set( "isdel", 1 )
    .first(); 

参数化查询说明1(id in 的特殊处理)

List<TCat> cats = db.find<TCat>( "Id in (:id1,:id2,:id3)" )

                .set( "id1", 6 )

                .set( "id2", 7 )

                .set( "id8", 8 )

                .list();——这句是对的。或者拼接ids,不使用参数化

注意,不应该是List<TCat> cats = db.find<TCat>( "Id in (:ids)" )

                .set( "ids", "6,7,8" )

                .list();——这句是错误的

更多说明在这里:http://www.wojilu.com/Forum1/Topic/1108


参数化查询说明2(like语句中的特殊处理)

正确的做法是:Post.find("Status=0 and Title like '%'+:t+'%'").set("t",t).list()

注意:不是 Post.find("Status=0 and Title like '%:t%'").set("t",t).list()——这是错误做法,注意区分。


findPage

DataPage<Article> plist = Article.findPage( "IsDelete=0" );
int rd = plist.RecordCount;
int pageCount = plist.PageCount;
string pagerBar = plist.PageBar;
List<Article> list = plist.Results;

findBySql

List<Article> list = Article.findBySql( "select * from Article" );

说明:更多直接sql查询请看教程《直接运行sql语句》

count

int articleCount = Article.count( "IsDelete=0" );

insert

Article article = new Article();
...
article.insert();

update

Article article = Article.findById( 2 );
article.Title = "my new title";
article.update(); 

update( string property )

Article article = Article.findById( 2 );
article.Title = "my new title";
article.update( "Title" );  

updateBatch

Article.updateBatch( "set IsDelete=1", "CategoryId=2" );

delete

Article article = Article.findById( 2 );
article.delete();  

deleteBatch

Article.deleteBatch( "CategoryId=2" );

以上方法看似简单,实际上可以对付95%的数据操作需求,尤其是第三个find方法,采用参数化查询方式,可以做大多数事情。

另外的 5% 的需求,您可以使用ORM内置的方法,直接运行原生的sql语句(运行sql教程参看此处),也是非常方便的。

在设计 wojilu ORM 的时候,改版了好多次,曾经的接口方法要多很多,也复杂很多。比如曾经有一个 findBy( string property, object val ) 方法,看似很有用,在实际项目中进行统计之后,才发现用到的地方极少,就砍掉了,万一需要,您也可以通过find方法实现。

这就是 wojilu ORM 的设计原则:简洁!简洁!简洁!实用!实用!实用!


【表名称和数据字段自定义】

默认情况下,对象名称和表名称是相同的,属性名称和数据字段名称也是相同的。但你可以修改两者之间的映射关系,如果属性名称和字段名称不一致的话。

 [Table("你的表名称")]
public class Article {

    [Column(Name="你的列名称")]
    public String Name {get;set;}

}

如上图蓝色部分,加上 Column 批注,可以映射字段,加上 Table 批注,可以映射表名称。


【时间类型】

    DateTime 类型的属性,如果不赋值,ORM默认会插入当前时间,即 DateTime.Now


【货币类型】

    如果要使用货币类型或者小数,做法是必须打上批注,要么打上 [Money] 批注,要么打上 [Decimal( Precision=10, Scale=5)] 批注。前者 money批注使用(19,4)的精度定义;后者由你自定义。

   比如——
    [Money]
    public decimal ProductPrice { get; set; }

    或者

    [Decimal( Precision=10, Scale=5)]
    public decimal ProductPrice { get; set; }


【直接使用.net原生对象,直接操作sql】

比如你要使用复杂的sql联表语句进行统计,你可以绕开ORM,直接使用.net原生对象。因为
wojilu框架作为一个.net平台下的框架,它和.net不是矛盾的关系。它能够让开发过程更加快速可靠,而不是说用了wojilu,就不能使用.net原生的方法了。在使用wojilu不方便的或力所不及的地方,仍然可以直接使用.net原生的方法。——这也就是为什么使用 wojilu framework 可以开发出“我记录网站综合系统”这个无所不包的系统的原因,因为.net能做的,它都能做到。你可以理解为,wojilu什么都能做

举个例子,使用wojilu ORM 可以应付95%以上的数据操作,但对于另外的5%的复杂查询,比如一些多表的联表检索和复杂统计,wojilu ORM就不擅长(其实任何一个ORM都不擅长复杂的查询和统计)。这时候,你可以直接使用.net 原生的command来操作,教程参看:http://www.wojilu.com/common/page/166 即使作为一个通用的第三方数据库查询组件,wojilu orm也是极其优秀、极其方便的。


【wojilu ORM 配置】

--------------------------------------

【垂直分库说明】

以用户表独立的例子,配置文件中相关内容如下——


    ConnectionStringTable : {

        default:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=wojilu.mdb",

        feeddb:"server=127.0.0.1;uid=sa;pwd=aa;database=feed;",

        userdb:"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=wojiluUser.mdb"

    },

    

    DbType : {

        default:"access",

        feeddb:"sqlserver",

        userdb:"access"

    },

    

    Mapping:[

        { name:"wojilu.Apps.Reader.Domain.FeedSource", database:"feeddb" },

        { name:"wojilu.Apps.Reader.Domain.FeedEntry", database:"feeddb" },

        { name:"wojilu.Members.Users.Domain.User", database:"userdb" }

    ],


上面配置指明:
FeedSource 和 FeedEntry 不再从默认数据库中读取数据,而是从 feeddb 中读取数据。
User 用户数据不再从默认数据库中读取,而是从 userdb 中读取。


不用修改源码,重启一下网站就直接生效。