12

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

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

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

4

3 回答 3

7

我通常遵循这些步骤。

  1. 我创建视图模型的方式代表了我想在视图中显示的确切数据和格式。
  2. 我通过 PetaPoco 直接从数据库查询到我的视图模型。

在我的分支中,我有一个

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

该方法采用现有对象并可以将列直接映射到按名称匹配的对象上。这非常适合这种情况。

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

于 2012-04-11T07:39:55.497 回答
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;
    }
于 2012-04-10T18:55:00.897 回答
0

QueryFirst在这里帮助吗?您可以获得微规则的速度,每个错误 - 编译时错误的额外舒适度,以及您的查询及其输出的智能感知。您按照上帝的意图定义 SQL 中的联接。如果输入连接条件真的让您烦恼,那么 DBForge可能是答案,因为您使用的是 SQL,这些工具是兼容的,并且您不会被锁定。

于 2016-06-06T16:00:13.987 回答