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

时间:2012-04-10 10:03:21

标签: c# orm dapper petapoco massive

我开始使用PetaPOCO和Dapper,他们都有自己的局限性。但恰恰相反,它们比实体框架闪电般快,我倾向于放弃它的局限性。

我的问题是:是否有任何ORM可以让我们具体定义一对多,多对一和多对多的关系? Dapper.Net和PetaPOCO都可以实现破解这些关系的黑客方式,而且当你有5-6个连接时它们甚至不能很好地扩展。如果没有一个微型ORM可以让我们处理它,那么我的第二个问题是我应该放弃这些微ORM在定义关系方面不是那么好并为每一种类型创建一个新的POCO实体的事实我将执行的查询包括这些类型的多连接?这可以很好地扩展吗?

我希望我对自己的问题很清楚。如果没有,请告诉我。

3 个答案:

答案 0 :(得分:7)

我通常会遵循这些步骤。

  1. 我以一种表示我想在视图中显示的确切数据和格式的方式创建我的viewmodel。
  2. 我直接从数据库通过PetaPoco查询我的视图模型。
  3. 在我的分行,我有一个

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

    采用现有对象并可以直接将列映射到名称匹配的方法。对于这种情况,这非常有效。

    如果需要,我的分支可以在这里找到。 https://github.com/schotime/petapoco/

答案 1 :(得分:2)

  当你可能有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;
    }

答案 2 :(得分:0)

QueryFirst会在这里提供帮助吗?你可以获得微观的速度,增加每个错误 - 编译时错误的舒适度,加上你的查询和输出的智能感知。您可以按照上帝的意图在SQL中定义连接。如果键入连接条件真的很烦人,DBForge可能就是答案,因为你在SQL中工作,这些工具是兼容的,而且你没有被锁定。