クラスGraphQLリリースのORMデータアクセスフレームワーク

Zongsoft.Data発表

私たちは、私たちのことを喜んでいる  ORMデータアクセスフレームワーク(Zongsoft.Data上の2つの中)のSaaSは、応用製品の後、今日は外国の昇進を発表しました!
これはクラスである  GraphQLの  スタイル  ORMO bject / R&LT elational  M apping)データアクセスフレーム。

そして、ホイール?

非常に長い時間は、.NETのキャンプは、一般的に使用されるの欠如だったようですORM早いネイティブから、データアクセスフレームワーク  ADO.NETエキゾチックにiBatis.NETHibernate.NET、以降経て  SQLのためのLINQ  と  E ntity Fおそらくramework乱闘、E ntity Fファジー位置決めrameworkとデザインの以前のバージョンは、このように一定の進展の期間を作成し、覇権のその位置の損失につながって変化を繰り返し、軍閥は戦国時代で合計。長いと期待にわたって繰り返さ、失望、もつれや痛みの後、私は最終的にハンズオン車輪を作成することを決めました。

デザイン

始める前に、まず次の基本的な設計原則を決定します。

  • 優先順位データベース(D ATA B ASE F. IRST)
  • 厳格なPOCO / POJOのサポート
  • マッピングモデルとコードが完全に分離します
  • ビジネス層が現れ禁止  SQLおよびクラス  SQLコードを

業務システムでは、データ構造とその関係注意深く設計担当のシステムアーキテクトや人によって開発された、基礎となるデータベースの間違いなく最も基本的な構造N O S Chemaは/ Wです Eakly Sトレンドが適用された蜂蜜Chemaです毒)尺度として策定この概念マッピングモデルの上にビジネス層の礎石としての関係に、データ・アクセス・マッピング・データベース・テーブルの構造、レベル間の分離。

注釈を付けることによって避けドメインモデルのエンティティ(ラベル)をメタデータ定義には、POCO / POJOパラダイムの遵守を確実にしなければなりません。セマンティックによってS関係データ構造へのアクセスChemaを宣言するために、アプリケーション層の禁止  SQLのLINQ  の式に基づくSQLの  コードは、データ層への依存を減らすことが、ビジネス層、メンテナンス性を向上させるためだけでなく、より均一な制御を持っています利便性、および最適化空間とデータ・アクセス・エンジンに自由度を提供しますが。

例として示しました

例3の方法により、下記(注:例がベースとしているZongsoft.Communityの項目)をデザインコンセプトの上部を実証するために、および実施例は、より参照してください記載Zongsoft.Data  プロジェクトREADME.mdの  文書や  Zongsoft.Communityコードプロジェクトを。

注:以下の例は以下に基づいているZongsoft.Community完全コミュニティフォーラムデーモンであるオープンソースプロジェクト、。あなたは、プロジェクトの前にそれを読む必要があるかもしれません「データベースのテーブル構造設計」より良いビジネスロジックのコード例を理解するために、ドキュメント。

Aの例

ナビゲーションとナビゲーションフィルタクエリ

var forums = this.DataAccess.Select<Forum>(
    Condition.Equal("SiteId", this.User.SiteId) &
    Condition.In("Visibility", Visibility.Internal, Visibility.Public) |
    (
        Condition.Equal("Visibility", Visibility.Specified) &
        Condition.Exists("Users",
                  Condition.Equal("UserId", this.User.UserId) &
                  (
                      Condition.Equal("IsModerator", true) |
                      Condition.NotEqual("Permission", Permission.None)
                  )
        )
    ),
    "*, MostRecentThread{ThreadId,Title,Creator{Name,Nickname,Avatar}}"
);

上記のデータアクセスクエリメソッドは、一般的に次のSQLスクリプトを生成します。

SELECT
    t.*,
    t1.ThreadId AS 'MostRecentThread.ThreadId',
    t1.Title AS 'MostRecentThread.Title',
    t1.CreatorId AS 'MostRecentThread.CreatorId',
    t2.UserId AS 'MostRecentThread.Creator.UserId',
    t2.Name AS 'MostRecentThread.Creator.Name',
    t2.Nickname AS 'MostRecentThread.Creator.Nickname',
    t2.Avatar AS 'MostRecentThread.Creator.Avatar'
FROM Forum t
    LEFT JOIN Thread AS t1 ON
        t.MostRecentThreadId=t1.ThreadId
    LEFT JOIN UserProfile AS t2 ON
        t1.CreatorId=t2.UserId
WHERE
    t.SiteId = @p1 AND
    t.Visibility IN (@p2, @p3) OR
    (
        t.Visibility = @p4 AND
        EXISTS
        (
            SELECT u.SiteId, u.ForumId, u.UserId
            FROM ForumUser u
            WHERE u.SiteId = t.SiteId AND
                  u.ForumId = t.ForumId AND
                  u.UserId = @p5 AND
                  (
                      u.IsModerator = @p6 OR
                      u.Permission != @p7
                  )
        )
    );

上記、例示的なによる  Select クエリプロセスschema パラメータ(すなわち、の値  *, MostRecentThread{ThreadId,Title,Creator{Name,Nickname,Avatar}} パラメータ)の必要性なくし、フォーム内のデータとクエリデータ間の階層関係を指定  SQLまたはクラスSQL構文  JOINそのようなだけでなく、より多く提供必須として構文要素をシンプルでセマンティックAPIのアクセス、および基礎となるデータアクセスエンジンの最適化に戻っはより大きなスペースと自由を提供します。

場合は  Select 、クエリメソッドのschema パラメータ値が変更され*,Moderators{*},MostRecentThread{ThreadId,Title,Creator{Name,Nickname,Avatar}} たデータアクセスエンジンの後に2つの多くの内部問い合わせに細分されるSQLのステートメントの反復実行、およびこれらは、効率が向上し、低減し、ビジネス層プロセススピンオフを、必要はありません。ビジネス層の複雑さ。

注:SによってChemaモード発現W EBのAPI  フロントエンド・アプリケーションで使用できるが、大幅に前端と後端の効率を高めるため、バックエンドの開発の負荷を軽減します。

例二

新団体の多くは

// 构建待新增的实体对象
var forum = new
{
    SiteId = this.User.SiteId,
    GroupId = 100,
    Name = "xxxx",

    // 一对多的导航属性
    Users = new ForumUser[]
    {
      new ForumUser { UserId = 1001, IsModerator = true },
      new ForumUser { UserId = 1002, Permission = Permission.Read },
      new ForumUser { UserId = 1003, Permission = Permission.Write },
    }
}

// 执行数据新增操作
this.DataAccess.Insert<Forum>(forum, "*, Users{*}");

追加は、データアクセス方法は、実質的に次のSQLスクリプトを生成し、言いました:

/* 主表插入语句,执行一次 */
INSERT INTO Forum (SiteId,ForumId,GroupId,Name,...) VALUES (@p1,@p2,@p3,@p4,...);

/* 子表插入语句,执行多次 */
INSERT INTO ForumUser (SiteId,ForumId,UserId,Permission,IsModerator) VALUES (@p1,@p2,@p3,@p4,@p5);

上述の実施によってInsert 新たなプロセス  schema パラメータ(すなわち、の値*,User{*} 指定されたパラメータ)基礎となる自動処理マッピング定義によるデータアクセスエンジンによって新しいデータの形のSQL実装では、単純かつ上位層サービスコード効率を確保するために。

例三

そして、「多くの」ナビゲーションプロパティの1対多の関連を更新するだけでなく、属性値を確実にする(コレクション)へ  UPSERTの  書き込みモードを。

public bool Approve(ulong threadId)
{
    //构建更新的条件
    var criteria =
        Condition.Equal(nameof(Thread.ThreadId), threadId) &
        Condition.Equal(nameof(Thread.Approved), false) &
        Condition.Equal(nameof(Thread.SiteId), this.User.SiteId) &
        Condition.Exists("Forum.Users",
            Condition.Equal(nameof(Forum.ForumUser.UserId), this.User.UserId) &
            Condition.Equal(nameof(Forum.ForumUser.IsModerator), true));

    //执行数据更新操作
    return this.DataAccess.Update<Thread>(new
    {
        Approved = true,
        ApprovedTime = DateTime.Now,
        Post = new
        {
            Approved = true,
        }
    }, criteria, "*,Post{Approved}") > 0;
}

更新は、データアクセス方法は、実質的に次のSQLスクリプトを生成し、言いました:

/* 以下代码为支持 OUTPUT/RETURNING 子句的数据库(如:SQLServer,Oracle,PostgreSQL) */

/* 根据更新的关联键创建临时表 */
CREATE TABLE #TMP
(
    PostId bigint NOT NULL
);

/* 更新主表,并将更新的关联键输出到内存临时表 */
UPDATE T SET
    T.[Approved]=@p1,
    T.[ApprovedTime]=@p2
OUTPUT DELETED.PostId INTO #TMP
FROM [Community_Thread] AS T
    LEFT JOIN [Community_Forum] AS T1 ON /* Forum */
        T1.[SiteId]=T.[SiteId] AND
        T1.[ForumId]=T.[ForumId]
WHERE
    T.[ThreadId]=@p3 AND
    T.[Approved]=@p4 AND
    T.[SiteId]=@p5 AND EXISTS (
        SELECT [SiteId],[ForumId]
        FROM [Community_ForumUser]
        WHERE [SiteId]=T1.[SiteId] AND
              [ForumId]=T1.[ForumId] AND
              [UserId]=@p6 AND
              [IsModerator]=@p7
    );

/* 更新关联表 */
UPDATE T SET
    T.[Approved]=@p1
FROM [Community_Post] AS T
WHERE EXISTS (
    SELECT [PostId]
    FROM #TMP
    WHERE [PostId]=T.[PostId]);

上述の実施によってUpdate 更新プロセスschemaパラメータ(すなわち、の値を*,Post{Approved} 指定されたパラメータ)形状データ更新は、生成されたデータベースのタイプに応じて効率的なデータアクセスエンジンSQLのすべてのサービス層のためのステートメントは、透明性のない感がありません。

ナビゲーション属性の多くにとって、データ・アクセス・エンジンは、デフォルト設定されますUPSERTの  について書かれたサブセットを処理するモード、UPSERT  より多くの情報を、ご参照くださいZongsoft.Dataの  プロジェクトのドキュメントを。

演奏

私たちは、最高の提供したいお金のため全体的な価値のための  ORMの主要な関心事のパフォーマンス、データアクセスエンジンを(ない)は、これらの要素:

  1. シンプルを効率的に生成するSQLスクリプト、および可能な限り最新のデータベース固有の使用してSQLの構文を、
  2. データ照会結果エンティティはアセンブリ(P opulate)プロセスは効率的でなければなりません。
  3. 避け反射、有効な構文木キャッシュ。

我々は、のレベルを達成するために使用されるE実際のアセンブリ(上の動的コンパイラ技術mitting Pの opulateを)、および他のデータは、利用可能な予熱するためのパラメータを結合  DataPopulatorのソースコードおよび他の関連するクラスの深い理解を。

他の

おかげで、「関係のデータ構造表現する文の道」セマンティックデザインコンセプトは、デザインの面で順序に関して、それはプログラムをより自然に基礎データと最適化、より寛容と自由を表現し、意図焦点を当てます。

より詳細な情報(例:個別の読み取りと書き込み、継承テーブル、データ・パターン、マップファイル、フィルター、バリ、型変換、データの分離)、関連文書をご参照ください。

サポートスポンサー

私たちは歓迎し、あらゆる種類のを楽しみにして販売促進をサポート!

あなたはこのプロジェクトのために私たちのデザインコンセプトに同意する場合は、(のようなポイントしてくださいSのプロジェクトが有用だと思うし、その将来の発展をサポートする場合タール)は、それをサポートするために必要な資金を与えてください。

  1. ウォッチZongsoftマイクロチャンネル公衆数は、私たちの記事は、報酬を搭載しました。
  2. 参加Zongsoft知識惑星リング、オンラインクイズや技術サポートを。
  3. あなたのビジネスは、オンサイト技術サポートとカウンセリング、または新しい機能を開発する必要、バグ修正などが必要な場合は、すぐにしてください電子メールを送信する私に。

まあマイクロチャネル番号

知識プラネット


注意:この記事を更新することができる、オリジナルをお読みください:http://zongsoft.com/blog/zh-cn/zongsoft/announcing-data-engine、回避エラーするために、古いコンテンツに起因するだけでなく、より良い読書経験。

おすすめ

転載: www.cnblogs.com/Zongsoft/p/announcing-data-engine.html