C# 从抽象类引用继承的EntitySet的dapper PropInfo Setter为null

C# 从抽象类引用继承的EntitySet的dapper PropInfo Setter为null,c#,.net,reflection,abstract-class,dapper,C#,.net,Reflection,Abstract Class,Dapper,我正试图用一些简洁的查询来取代令人讨厌的LINQ2SQL,以提高性能。在这样做的过程中,我必须将一堆不同的对象编织在一起,以便创建一个大对象来保存ASN信息所需的所有信息 我现在遇到的问题是一个抽象类Orders,这个类由两个独立的类AutionOrder和MerchantOrder使用discriminator属性实现 因为我不能使用dapper创建一个抽象类的对象,所以我使用的是一个公共类。但是,当它开始构建对象时,它在GetSettableProps内部失败,它正在查找正确的Declari

我正试图用一些简洁的查询来取代令人讨厌的LINQ2SQL,以提高性能。在这样做的过程中,我必须将一堆不同的对象编织在一起,以便创建一个大对象来保存ASN信息所需的所有信息

我现在遇到的问题是一个抽象类Orders,这个类由两个独立的类AutionOrder和MerchantOrder使用discriminator属性实现

因为我不能使用dapper创建一个抽象类的对象,所以我使用的是一个公共类。但是,当它开始构建对象时,它在
GetSettableProps
内部失败,它正在查找正确的
DeclaringType
,但是
GetProperty
方法在查找
内部的属性或
实体集的属性时返回null。我尝试使用
t.BaseType.GetProperty
以及
p.GetAccessors().First().GetBaseDefinition().DeclaringType.GetProperty(p.Name).GetSetMethod(true)
来破解它,但没有成功

虚拟对象:

命令

订单ID、名称、地址、行版本(内部)、发货(EntitySet)、订单详细信息(EntitySet)、客户(EntityRef)

装运

ShipmentID、OrderID、TrackingNumber

订单详情

OrderDetailID、OrderID、产品、数量、价格

顾客

CustomerID,Name

对于这个特殊的SQL,我正试图获取一些我需要的1对1关系映射

选择o.*from Orders as o left join Customers as c on o.CustomerID=c.CustomerID,其中o.OrderID在(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");
}
使用(var连接=新的SqlConnection(_ConnectionString))
{
connection.Open();
结果=connection.Query(sql.ToString(),
(o,c)=>{o.客户=c;返回o;},
splitOn:“客户ID”);
}
如果我改成一个公共类,这个问题就会消失,但这并不是我想要的副作用。尝试为RowVersion设置propInfo时失败-将其切换为public而不是internal解决了此问题-尽管不希望这样。但是,当它试图为订单创建装运对象时,它失败了。同样,当Order是一个公共类时,这一切都不是问题

此外,我正在进行单独的查询,以引入多对一关系,例如发货到订单和OrderDetails到订单,并将结果规范化为适当的Order对象。 MerchantOrder几乎是一个空类,没有真正的特殊逻辑。这里的区别在于我们最终如何找到在实际SQL命中之前被抽象掉的CustomerID

此外,我正在使用截至2011年12月20日的最新版本dapper

我真的很喜欢整洁,但是这个问题让我的头变得很僵硬——所以谢谢你的帮助

我认为不修改代码是不可能的(因为抽象类)

我也遇到了类似的问题,最终创建了一个新的程序集专用对象,其中我的存储库是从抽象基类派生的


此类不是抽象类,仅对存储数据的repository类可见,此类具有实际表所需的所有方法。

这是一个错误,现在已在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; }
        }
    }

    // http://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);

    }

我们选择了“两个都不设置”

你能添加一个失败的测试,这样我就可以解决这个问题了吗?只需提交一个带有itI的补丁,我就添加了一个失败测试@我在自动推进我的更改时遇到了很多问题,所以我一个接一个地做了。如果需要更改,请告诉我。谢谢非常感谢您的修复!这让我挠头好一阵子!今年我收到了最好的生日礼物!
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?