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クラスを定義します
    //           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();
    }