我开始使用PetaPOCO和Dapper,他们都有自己的局限性。但恰恰相反,它们比实体框架闪电般快,我倾向于放弃它的局限性。
我的问题是:是否有任何ORM可以让我们具体定义一对多,多对一和多对多的关系? Dapper.Net和PetaPOCO都可以实现破解这些关系的黑客方式,而且当你有5-6个连接时它们甚至不能很好地扩展。如果没有一个微型ORM可以让我们处理它,那么我的第二个问题是我应该放弃这些微ORM在定义关系方面不是那么好并为每一种类型创建一个新的POCO实体的事实我将执行的查询包括这些类型的多连接?这可以很好地扩展吗?
我希望我对自己的问题很清楚。如果没有,请告诉我。
答案 0 :(得分:7)
我通常会遵循这些步骤。
在我的分行,我有一个
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中工作,这些工具是兼容的,而且你没有被锁定。