我有两个关于使用小巧玲珑的问题:
有没有办法加载像entity-framework这样的导航键属性(延迟加载)?
POCO serialization
和dynamic serialization
之间有什么区别?
哪个更好?以及如何使用此序列化?
答案 0 :(得分:12)
有没有办法加载导航键属性,如实体框架(延迟加载)?
不,Dapper是一个直接的SQL库,这就是为什么它如此荒谬快速。自动装载没有任何开销。但是,您可以一次加载多个实体。
POCO序列化与动态序列化有什么区别?哪个更好?以及如何使用此序列化?
POCO序列化更有效,因为该类型在编译时是众所周知的,动态序列化有点贵,因为它必须在运行时进行评估。除此之外没有什么区别。
但是,我会在任何地方的 所有其他 库之上推荐Dapper。它简单,快速,非常灵活。相信我,我已经使用了很多框架和库来进行数据访问。
查看多重映射和多重结果
答案 1 :(得分:9)
1:不;没有,除非你自己完全滚动它。它是故意的简约和确定性的
2:如果要将数据公开给应用程序的其他部分,例如作为视图模型的数据,实现POCO非常方便。例如,Query<Customer>
可以填充您可以在其他地方编码的众所周知的Customer
对象。 dynamic
非常方便,但不是可探索的 - 并且不适用于数据绑定或智能感知。但是,对于保持非常局部的DAL方法,或者示例
var row = conn.Query("select qty, cost from parts where id = @id",
new { id }).Single();
int qty = row.qty;
decimal cost = row.cost;
// and off we go...
或:
var lookup = conn.Query("select id, name from somelookup").ToDictionary(
x => (int)x.id, x => (string)x.name);
答案 2 :(得分:2)
据我所知,除非你在.NET中使用Lazy<T>
类手工制作东西,否则dapper中没有延迟加载支持。
POCO序列化是您定义类的地方,其实例用于从表中添加/编辑/读取行。
动态序列化是您在.NET中使用dynamic
对象的地方(您不在其中定义类)。
动态将更快开始,虽然你没有智能感或类型安全性。 POCO需要更长的时间来设置(因为你需要创建你想要使用的每个类),但你保持类型安全和智能感知。
答案 3 :(得分:1)
Castle的动态代理为使用Dapper进行延迟加载提供了另一个选择。我已经成功地使用Dapper,Dynamic Proxy和Mediatr成功编写了一个POC框架,从而可以在访问时(即在访问时)对属性进行延迟加载。
例如
public class Customer
{
public IEnumerable<Order> Orders { get; set; }
}
public class Order
{
public IEnumerable<OrderLine> OrderLines { get; set; }
}
public class OrderLine
{
/*
* ...
*/
}
然后当您像这样使用时:
Customer customer = ... /*Load from database*/
/* Perform some logic */
// Access "Orders"
foreach(Order order in customer.Orders)//loads orders from the database
{
foreach(OrderLine in order.OrderLines) //loads order lines from the database
{
}
}
因此您不必仅使用Lazy<T>
即可通过其他方式完成