DapperPoco--Dapperベース、軽量レベル、高性能、シンプル、柔軟なORMフレームワーク
Entity Framework
私は馬鹿化した使い方のフレームワークが好きで、同時に活性を失わない.
EFは使いやすいが,柔軟性が足りない.たとえば、EF Coreでは元のSQLでマルチテーブル接続クエリーを書くことはできません(返される結果はマルチテーブル接続の結果です).
単表の簡単な条件の検索はまだ良くて、多表の検索の時生成するSQLの性能は本当にお世辞を言う勇気がなくて、私は更に自分でSQLを書くことが好きで、制御性は更に高くて、心の中は底があります
EFの設計はプロジェクトの階層化に不利である.私の理想的な設計は隔離、低結合で、データベースと付き合うことはDb層に任せて、すべてのデータベースの特性はDb層の内部に隔離して、対外的に業務によって馬鹿化のインターフェースを提供します.EFを使用すると、SaveChangesをDbレイヤにカプセル化しても、ナビゲーションプロパティがデータベースを再クエリーすることになります.
Dapper
私はその軽量級、高性能が好きです.しかし、元のSQL読み書きデータベースのみを「サポート」しているため、使い勝手が悪い.
多くのよく使われる情景は実はSQLを書かないでカプセル化することができて、EFのように、直接d 1つのEntityを追加します
現在、Dapperにはこのようなパッケージがありますが、現在ではあまりにも粗雑です.
PetaPoco
EFのように直接Entityを追加したり、Dapperのように自分でオリジナルSQLを書いたりすることができますが、これはもう完璧です.
ただし、一括挿入、更新はサポートされていませんね
DapperPoco
本当に満足のいくフレームワークが見つからない場合、DapperPocoが誕生しました.それはDapperの高度なパッケージに基づいており、Dapperのすべての利点があり、同時にその不足を補い、以下の特徴があります.高性能(Dapperと一致) をホットスタート後に計算する(キャッシュプロセスが最初に起動された).はEFのように使いやすく、Dapperのように原生SQL も柔軟に使えますは、Fluent APIを使用してエンティティマッピングを定義する をサポートする.内部モジュール化柔軟性、拡張性 オープンソースをgithubに配置しました.アドレスは次のとおりです.https://github.com/md-frank/DapperPoco
使用方法
まずPocoクラスを定義します
DbContextの作成
データの挿入
データの更新
データの保存
データの削除
データの問合せ(即時実行)
クエリーデータ(実行遅延)
遅延クエリはQueryを使用します.Fetchとは異なり、Queryが返す結果は、使用時にのみデータベースを実際にクエリします.
動的クエリー条件
トランザクションのサポート
私は馬鹿化した使い方のフレームワークが好きで、同時に活性を失わない.
EFは使いやすいが,柔軟性が足りない.たとえば、EF Coreでは元のSQLでマルチテーブル接続クエリーを書くことはできません(返される結果はマルチテーブル接続の結果です).
単表の簡単な条件の検索はまだ良くて、多表の検索の時生成するSQLの性能は本当にお世辞を言う勇気がなくて、私は更に自分でSQLを書くことが好きで、制御性は更に高くて、心の中は底があります
EFの設計はプロジェクトの階層化に不利である.私の理想的な設計は隔離、低結合で、データベースと付き合うことはDb層に任せて、すべてのデータベースの特性はDb層の内部に隔離して、対外的に業務によって馬鹿化のインターフェースを提供します.EFを使用すると、SaveChangesをDbレイヤにカプセル化しても、ナビゲーションプロパティがデータベースを再クエリーすることになります.
Dapper
私はその軽量級、高性能が好きです.しかし、元のSQL読み書きデータベースのみを「サポート」しているため、使い勝手が悪い.
多くのよく使われる情景は実はSQLを書かないでカプセル化することができて、EFのように、直接d 1つのEntityを追加します
現在、Dapperにはこのようなパッケージがありますが、現在ではあまりにも粗雑です.
PetaPoco
EFのように直接Entityを追加したり、Dapperのように自分でオリジナルSQLを書いたりすることができますが、これはもう完璧です.
ただし、一括挿入、更新はサポートされていませんね
DapperPoco
本当に満足のいくフレームワークが見つからない場合、DapperPocoが誕生しました.それはDapperの高度なパッケージに基づいており、Dapperのすべての利点があり、同時にその不足を補い、以下の特徴があります.
使用方法
まずPocoクラスを定義します
// public class Article
{ public long Id { get; set; } public string Title { get; set; } public string Content { get; set; }
}
DbContextの作成
class MasterDbContext : DbContext
{ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseConnectionString(" "); // SQL Server
optionsBuilder.UseSqlAdapter(new SqlServerAdapter(SqlClientFactory.Instance));
} // Poco
protected override void OnEntitiesBuilding(EntitiesBuilder entityBuilder)
{ // ( ) ,
entityBuilder.Entity()
.TableName("T_Article")
.ColumnName(p => p.Id, "article_id");
}
}
データの挿入
var masterDb = new MasterDbContext();// Poco var a = new Article
{
Title = "hello",
Content = "hello word"};
masterDb.Insert(a);// 2 masterDb.Insert(new Article[] { a, a });// masterDb.Insert(a, "T_Article");// SQL this.Execute("insert T_Article(Title, Content) values (@Title, @Content)", a);// 2 this.Execute("insert T_Article(Title, Content) values (@Title, @Content)", a, a);// 2 this.Execute("insert T_Article(Title, Content) values (@Title, @Content)", new Article[] { a, a });// this.Execute("insert T_Article(Title, Content) values (@p0, @p1)", "hello", "hello word");
データの更新
var masterDb = new MasterDbContext();// var article = masterDb.FirstOrDefault("select * from T_Article where article_id = @p0", 1);// article.Title = "hello 2";
article.Content = "content 1";
masterDb.Update(article);// , article.Title = "hello 2";
masterDb.Update(article, new [] { "Title" });// , article.Title = "hello 3";
article.Content = "content 1";
masterDb.Update(article, null, null, p=> p.Title, p=> p.Content);
データの保存
var masterDb = new MasterDbContext();var article = new Article
{
Id = 1,
Title = "hello",
Content = "hello word"};// , masterDb.Save(article);// masterDb.Save(article, new [] { "Title" });
データの削除
var masterDb = new MasterDbContext();var article = masterDb.FirstOrDefault("select * from T_Article where article_id = @p0", 1);// masterDb.Delete(article);// , masterDb.Delete(article, "article_id");
データの問合せ(即時実行)
var masterDb = new MasterDbContext();// T_Article var articles = masterDb.FetchAll();// , var articles = masterDb.Fetch("select * from T_Article where Title=@p0 and Content=@p1", "hello", "hello word");// , ( IEnumerable )var articles = masterDb.Fetch("select * from T_Article where article_id in @p0", new [] { 1, 2, 3 });// masterDb.FirstOrDefault("select * from T_Article where article_id = @p0", 1);// var count = masterDb.ExecuteScalar("select count(*) from T_Article");// ( 1 , 20 )Paged paged = masterDb.Paged(1, 20, "select * from T_Article where Title=@p0", "hello");//Paged public class Paged where T : new()
{ //
public int CurrentPage { get; set; } //
public int TotalPages { get; set; } ///
public long TotalItems { get; set; } //
public int ItemsPerPage { get; set; } //
public List Items { get; set; }
}
クエリーデータ(実行遅延)
遅延クエリはQueryを使用します.Fetchとは異なり、Queryが返す結果は、使用時にのみデータベースを実際にクエリします.
var masterDb = new MasterDbContext();// var articles = masterDb.Query("select * from T_Article where Title=@p0", "hello");
動的クエリー条件
var title = " ";var sb = new SqlBuilder();
sb.Append("select * from T_Article");if(!string.IsNullOrEmpty(title))
sb.Append("where Title=@p0", title);var sql = sb.Build();var articles = masterDb.Fetch(sql.Statement, sql.Parameters);
トランザクションのサポート
using (var trans = this.GetTransaction())
{ // // trans.Complete();
}