11

我有两个关于使用 dapper 的问题:

  1. 有没有办法加载像实体框架(延迟加载)这样的导航键属性?

  2. POCO serialization和 有什么区别dynamic serialization?哪个更好?以及如何使用此序列化?

4

4 回答 4

10

有没有办法加载像实体框架(延迟加载)这样的导航键属性?

不,Dapper 是一个直接 SQL 库,这就是为什么它的速度如此之快。自动加载没有开销。但是,您可以一次加载多个实体。

POCO序列化和动态序列化有什么区别?哪个更好?我怎样才能使用这个序列化?

POCO 序列化更有效,因为该类型在编译时是众所周知的,而动态序列化则更昂贵,因为它必须在运行时进行评估。除此之外并没有真正的区别。

但是,我会推荐 Dapper,而不是任何地方的所有其他库。它简单、快速且极其灵活。相信我,我已经使用了很多框架和库来进行数据访问。

小巧玲珑的文档

看看多重映射多重结果

于 2012-12-19T16:21:12.867 回答
8

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);
于 2012-12-19T16:23:17.853 回答
1

据我所知,dapper 中没有延迟加载支持,除非您使用Lazy<T>.NET 中的类手工制作某些东西。

POCO 序列化是您定义一个类的地方,它的实例用于从表中添加/编辑/读取行。

动态序列化是您在 .NET 中使用dynamic对象的地方(您不定义类)。

尽管您没有智能感知或类型安全性,但动态会更快地开始。POCO 的设置需要更长的时间(因为您需要创建要使用的每个类),但您可以保持类型安全和智能感知。

于 2012-12-19T16:23:16.810 回答
0

使用 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>它可以通过其他方式完成

于 2020-01-23T13:22:25.500 回答