使用微型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合法吗? 是的,了解原因