我有两个关于使用 dapper 的问题:
有没有办法加载像实体框架(延迟加载)这样的导航键属性?
POCO serialization
和 有什么区别dynamic serialization
?哪个更好?以及如何使用此序列化?
有没有办法加载像实体框架(延迟加载)这样的导航键属性?
不,Dapper 是一个直接 SQL 库,这就是为什么它的速度如此之快。自动加载没有开销。但是,您可以一次加载多个实体。
POCO序列化和动态序列化有什么区别?哪个更好?我怎样才能使用这个序列化?
POCO 序列化更有效,因为该类型在编译时是众所周知的,而动态序列化则更昂贵,因为它必须在运行时进行评估。除此之外并没有真正的区别。
但是,我会推荐 Dapper,而不是任何地方的所有其他库。它简单、快速且极其灵活。相信我,我已经使用了很多框架和库来进行数据访问。
看看多重映射和多重结果
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);
据我所知,dapper 中没有延迟加载支持,除非您使用Lazy<T>
.NET 中的类手工制作某些东西。
POCO 序列化是您定义一个类的地方,它的实例用于从表中添加/编辑/读取行。
动态序列化是您在 .NET 中使用dynamic
对象的地方(您不定义类)。
尽管您没有智能感知或类型安全性,但动态会更快地开始。POCO 的设置需要更长的时间(因为您需要创建要使用的每个类),但您可以保持类型安全和智能感知。
使用 Dapper 提供另一个延迟加载选项是 Castle 的动态代理。我已经成功地使用 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>
它可以通过其他方式完成