マイクロORMで作業する場合のベストな戦略ですか?

c# dapper massive orm petapoco

質問

私はPetaPOCOとDapperを使い始めましたが、どちらも独自の制限があります。しかしそれとは逆に、Entity Frameworkよりも非常に高速ですので、私はその限界を逃す傾向があります。

私の質問は、1対多、多対1および多対多の関係を具体的に定義できるORMはありますか? Dapper.NetとPetaPOCOはどちらも、これらの関係を偽造するためのハック・アイの方法を実装しています。さらに、5-6の結合を持つと、うまく拡張できません。私たちがそれを扱うことができる単一のマイクロORMがなければ、私の第2の質問は、これらのマイクロORMが関係を定義する上でそれほど良くなく、あらゆる単一のタイプに対して新しいPOCOエンティティこれらのタイプのマルチジョインを含むクエリを実行していますか?これはうまくスケールできますか?

私は私の質問で私は明確であることを願っています。そうでない場合は、私に知らせてください。

受け入れられた回答

私は一般的にこれらの手順に従います。

  1. ビューで表示したいデータとフォーマットを表すビューモデルを作成します。
  2. 私はPetaPocoを介してデータベースから直接ビューモデルに問い合わせます。

私の支店で私は

T SingleInto<T>(T instance, string sql, params object[] args);

メソッドは、既存のオブジェクトを受け取り、名前にマッチした列に直接列をマップできます。これはこのシナリオではうまく機能します。

必要に応じて私の支店を見つけることができます。 https://github.com/schotime/petapoco/


人気のある回答

5〜6個の結合がある場合、それらは非常にうまく拡張できません

はい、そうではありませんが、それは良いことです。構築するシステムが複雑になると、パフォーマンスの不利益や頭痛のない、自由に結合できます。

はい、私はLinq2SQLでこのJOINSを書く必要はありませんが、共通の結合を書くための簡単なツールを作成して、基本的なSQLをすべてのエンティティに渡してから、そこから構築できます。

例:

[TableName("Product")]
[PrimaryKey("ProductID")]
[ExplicitColumns]
public class Product {
    [PetaPoco.Column("ProductID")]
    public int ProductID { get; set; }

    [PetaPoco.Column("Name")]
    [Display(Name = "Name")]
    [Required]
    [StringLength(50)]
    public String Name { get; set; }

            ...
            ...

    [PetaPoco.Column("ProductTypeID")]
    [Display(Name = "ProductType")]
    public int ProductTypeID { get; set; }

    [ResultColumn]
    public string ProductType { get; set; }

            ...
            ...


    public static Product SingleOrDefault(int id) {
        var sql = BaseQuery();
        sql.Append("WHERE Product.ProductID = @0", id);
        return DbHelper.CurrentDb().SingleOrDefault<Product>(sql);
    }
    public static PetaPoco.Sql BaseQuery(int TopN = 0) {
        var sql = PetaPoco.Sql.Builder;
        sql.AppendSelectTop(TopN);
        sql.Append("Product.*, ProductType.Name as ProductType");
        sql.Append("FROM Product");
        sql.Append("    INNER JOIN ProductType ON Product.ProductoTypeID = ProductType.ProductTypeID");
        return sql;
    }


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow