我的所有DAL函数都使用dbContext.Database.SqlQuery
来映射业务逻辑对象中的存储过程结果。
我的申请变得更加复杂,我正在寻找一个现代化的,#34;最新的"处理以下情况的方法。我知道我可以使用像SqlDataReader
这样的低级ADO.NET组件来实现这一点,并手动映射结果,但我确信使用Entity Framework 6是最好的方法。
问题:使用此命令dbContext.Database.SqlQuery<MyClass>
,我无法处理:
返回2个结果集的存储过程
将结果集映射到复杂数据类型
示例:
public class Order
{
public Customer customer { get; set; }
public Items[] items { get; set; }
}
同样,我知道我可以手动或使用AutoMapper进行映射,但我正在寻找最新的&#34;最新的&#34;基于实体框架6的方法。
答案 0 :(得分:2)
是的,有一种方法可以使用 Translate 。
var cmd = dbContext.Database.Connection.CreateCommand();
cmd.CommandText = "[dbo].[GetAllCustomersAndOrders]";
dbContext.Database.Connection.Open();
// Run the sproc
var reader = cmd.ExecuteReader();
var Customers= ((IObjectContextAdapter)dbContext)
.ObjectContext
.Translate<Customer>(reader, "Customers", MergeOption.AppendOnly);
reader.NextResult();
var Orders = ((IObjectContextAdapter)db)
.ObjectContext
.Translate<Order>(reader, "Orders", MergeOption.AppendOnly);
就映射问题而言
从结果到第二级复杂类型的几列?例如: SELECT FirstName,LastName,OrderId FROM Orders我想将它映射到: 公共类订单{public Customer customer {get;组; public int OrderId {get;组; }}
最好的方法是在订单表中使用 CustomerId ,引用 Customer 表,而不是 FirstName / 名字。这将是一个很好的重构,使数据库正常化。否则,您的对象和数据库之间不会有真正的映射,因为 Order 对象将具有数据库中不存在的 Customer 属性。在这种情况下,您必须创建一个类,例如 NormalizedOrder
public class NormalizedOrder {
int OrderId { get; set; };
Customer OrderCustomer { get; set; };
}
然后,在上面检索所有订单的代码之后,执行类似
的操作 var NormalizedOrders = Orders.Select new Order(){OrderId = e.OrderId, OrderCustomer = new Customer(){FirstName=>e.FirstName,LastName=>e.LastName}};