gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:27:07 24 4
gpt4 key购买 nike

我正在尝试用一些简洁的查询替换令人讨厌的 LINQ 2 SQL 命中以提高性能。这样做时,我必须将一堆不同的对象编织在一起,以创建保存 ASN 信息所需的所有信息所需的大对象。

我目前遇到的问题是抽象类 Orders,该类由两个单独的类 AutionOrder 和 MerchantOrder 使用鉴别器属性实现。

由于我无法使用 dapper 创建抽象类对象,因此我改用其中一个公共(public)类。但是,当它构建对象时,它在 GetSettableProps 内部失败,它找到了正确的 DeclaringType 但是 GetProperty 方法在它返回 null 时正在寻找 internalEntitySet 的属性。我尝试使用 t.BaseType.GetPropertyp.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 命中,我试图获取一些我需要的一对一关系映射。

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");
}

如果我将 Order 更改为公共(public)类,这个问题就会消失,但这不是预期的副作用。尝试为 RowVersion 设置 propInfo 时失败 - 将其切换为 public 而不是 internal 解决了这个问题 - 尽管不是期望的。但是当它试图为 Order 创建 Shipments 对象时失败了。同样,当 Order 是公共(public)类时,这一切都不是问题。

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

另外,我使用的是截至 2011 年 12 月 20 日的最新版本的 dapper。

我真的很喜欢 dapper,但这个问题让我头晕目眩 - 所以谢谢你的帮助!

最佳答案

这是一个错误,现在已在主干中修复:

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);

}

请注意,根据设计,我们不会在基类中设置私有(private)字段或属性。这种行为可能是神奇的并且不一致。

例如:

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?

我们选择“两者都不设置”

关于c# - 从抽象类引用继承的 EntitySet 的 dapper PropInfo Setter 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8593871/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com