来自抽象类引用的c# – dapper PropInfo Setter for inherited EntitySet为null

我试图用一些dapper查询来替换一个令人讨厌的LINQ 2 SQL命中,以改善性能.在这样做的时候,我必须编织一堆不同的对象,以便创建保存ASN信息所需的所有信息所需的大对象.

我目前遇到的问题是使用抽象类Orders,该类由两个独立类AutionOrder和MerchantOrder使用discriminator属性实现.

因为我不能使用dapper创建一个抽象类的对象,而是使用其中一个公共类.然而,当它构建对象时,它在GetSettableProps内部失败,它正在找到适当的DeclaringType,但是GetProperty方法在寻找内部属性或EntitySet时返回null.我试图使用t.BaseType.GetProperty以及p.GetAccessors()First()GetBaseDefinition().DeclaringType.GetProperty(p.Name).GetSetMethod(true),没有成功.

虚拟对象:

Order

OrderID, Name, Address, RowVersion(internal), Shipments(EntitySet),OrderDetails(EntitySet), Customer(EntityRef)

  
  装船
  
  

ShipmentID, OrderID, TrackingNumber

  
  订单详细信息
  
  

OrderDetailID, OrderID, Product, QTY, Price

  
  顾客
  
  

CustomerID, Name,

对于这个特殊的SQL命中,我试图抓住我需要的1到1关系映射.

SELECT o.* from Orders as o left join Customers as c on o.CustomerID = c.CustomerID where o.OrderID in (1,2,3);

这是我用来使用dapper,让它做的是魔术:

using (var connection = new SqlConnection(_ConnectionString))
{
    connection.Open();
    results = connection.Query<MerchantOrder, MerchantCustomer, MerchantOrder>(sql.ToString(),
        (o, c) => { o.Customer = c; return o; },
        splitOn: "CustomerID");
}

如果我将订单变成公共类,这个问题消失了,但这不是一个期望的副作用.当尝试为RowVersion设置propInfo时,它是失败的 – 将其切换到公开,而不是内部解决这个问题 – 虽然不是所需的.但是当它尝试为Order创建Shipments对象时失败.当Order是一个公共类时,这一点也不是一个问题.

此外,我正在单独查询,以便将多个到一个关系,例如“订单的订单”和“订单的订单”以及将结果规范化为正确的订单对象.
MerchantOrder几乎是一个没有真正特殊逻辑的空类.这里的区别是我们最终如何找到在实际的SQL命令之前抽象出来的CustomerID.

此外,我正在使用截至12/20/2011的最新版本的dapper.

我真的很喜欢dapper,但是这个问题让我的头脑不爽 – 所以谢谢你的帮助!

这是一个bug,现在固定在trunk中:

public class AbstractInheritance
    {
        public abstract class Order
        {
            internal int Internal { get; set; }
            protected int Protected { get; set; }
            public int Public { get; set; }

            public int ProtectedVal { get { return Protected; } }
        }

        public class ConcreteOrder : Order
        {
            public int Concrete { get; set; }
        }
    }

    // https://stackoverflow.com/q/8593871
    public void TestAbstractInheritance() 
    {
        var order = connection.Query<AbstractInheritance.ConcreteOrder>("select 1 Internal,2 Protected,3 [Public],4 Concrete").First();

        order.Internal.IsEqualTo(1);
        order.ProtectedVal.IsEqualTo(2);
        order.Public.IsEqualTo(3);
        order.Concrete.IsEqualTo(4);

    }

一方面,通过设计,我们不会在基类中设置私有字段或属性.行为可能是神奇而不一致的.

例如:

class A { private int a {get; set;} }
class B : A { private int a {get; set;} } 
class C: B {} 

// What should "select 1 a" do? Set it on A? Set it on B? Set it on Both? Set it on neither?

我们去了,“不设置”

翻译自:https://stackoverflow.com/questions/8593871/dapper-propinfo-setter-for-inherited-entityset-from-abstract-class-reference-is

转载注明原文:来自抽象类引用的c# – dapper PropInfo Setter for inherited EntitySet为null