使用微型ORM時的最佳策略?

c# dapper massive orm petapoco

我開始使用PetaPOCO和Dapper,他們都有自己的局限性。但恰恰相反,它們比實體框架閃電般快,我傾向於放棄它的局限性。

我的問題是:是否有任何ORM可以讓我們具體定義一對多,多對一和多對多的關係? Dapper.Net和PetaPOCO都可以實現破解這些關係的黑客方式,而且當你有5-6個連接時它們甚至不能很好地擴展。如果沒有一個微型ORM可以讓我們處理它,那麼我的第二個問題是我應該放棄這些微ORM在定義關係方面不是那麼好並為每一種類型創建一個新的POCO實體的事實我將執行的查詢包括這些類型的多連接?這可以很好地擴展嗎?

我希望我對自己的問題很清楚。如果沒有,請告訴我。

一般承認的答案

我通常遵循這些步驟。

  1. 我以這樣的方式創建我的viewmodel,表示我想在視圖中顯示的確切數據和格式。
  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
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因