標籤:
Dapper是.NET下一個micro的ORM,它和Entity Framework或Nhibnate不同,屬於輕量級的,並且是半自動的。也就是說實體類都要自己寫。它沒有複雜的設定檔,一個單檔案就可以了。給出官方地址。
http://code.google.com/p/dapper-dot-net/
個人覺得他非常好用,現在已經取代了原來的SqlHelper。優點:
- 使用Dapper可以自動進行對象映射!
- 輕量級,單檔案。
- 支援多資料庫。
- Dapper原理通過Emit反射IDataReader的序列隊列,來快速的得到和產生對象。
網上還有對Dapper的擴充類,這裡就不贅述了。下面只講下簡單的增刪改查、資料庫表間的對應關係和事務的應用。
先給出實體類的關係:
書和書評是1---n的關係。(沿用Entity Framework的實體類,virtual表示消極式載入,此處忽略)
//書public class Book { public Book() { Reviews = new List<BookReview>(); } public int Id { get; set; } public string Name { get; set; } public virtual List<BookReview> Reviews { get; set; } public override string ToString() { return string.Format("[{0}]------《{1}》", Id, Name); } }//書評 public class BookReview { public int Id { get; set; } public int BookId { get; set; } public virtual string Content { get; set; } public virtual Book AssoicationWithBook { get; set; } public override string ToString() { return string.Format("{0})--[{1}]\t\"{3}\"", Id, BookId, Content); } }
由於Dapper ORM的操作實際上是對IDbConnection類的擴充,所有的方法都是該類的擴充方法。所以在使用前先執行個體化一個IDBConnection對象。
IDbConnection conn = new SqlConnection(connString);
Insert
Book book = new Book(); book.Name="C#本質論"; string query = "INSERT INTO Book(Name)VALUES(@name)";//對對象進行操作 conn.Execute(query, book);//直接賦值操作 conn.Execute(query, new {name = "C#本質論"});
update
string query = "UPDATE Book SET [email protected] WHERE id [email protected]"; conn.Execute(query, book);
delete
string query = "DELETE FROM Book WHERE id = @id";conn.Execute(query, book);conn.Execute(query, new { id = id });
query
string query = "SELECT * FROM Book";//無參數查詢,返回列表,帶參數查詢和之前的參數賦值法相同。 conn.Query<Book>(query).ToList(); //返回單條資訊 string query = "SELECT * FROM Book WHERE id = @id"; book = conn.Query<Book>(query, new { id = id }).SingleOrDefault();
//查詢圖書時,同時尋找對應的書評,並存在List中。實現1--n的查詢操作string query = "SELECT * FROM Book b LEFT JOIN BookReview br ON br.BookId = b.Id WHERE b.id = @id";Book lookup = null;//Query<TFirst, TSecond, TReturn> var b = conn.Query<Book, BookReview, Book>(query, (book, bookReview) => { //掃描第一條記錄,判斷非空和非重複 if (lookup == null || lookup.Id != book.Id) lookup = book; //書對應的書評非空,加入當前書的書評List中,最後把重複的書去掉。 if (bookReview != null) lookup.Reviews.Add(bookReview); return lookup; }, new { id = id }).Distinct().SingleOrDefault();return b;
//1--1操作 BookReview br;string query = "SELECT * FROM BookReview WHERE id = @id";using (conn){ br = conn.Query<BookReview, Book, BookReview>(query, (bookReview, book) => { bookReview.AssoicationWithBook = book; return bookReview; }, new { id = id }).SingleOrDefault(); return br;}
using (conn){//開始事務IDbTransaction transaction = conn.BeginTransaction(); try { string query = "DELETE FROM Book WHERE id = @id"; string query2 = "DELETE FORM BookReview WHERE BookId = @BookId"; conn.Execute(query2, new { BookId = id }, transaction, null, null); conn.Execute(query, new { id = id }, transaction, null, null); //提交事務 transaction.Commit(); } catch (Exception ex) { //出現異常,事務Rollback transaction.Rollback(); throw new Exception(ex.Message); }
}
Dapper的基本使用