实体框架数据集映射

3

我的所有DAL函数都使用dbContext.Database.SqlQuery将存储过程结果映射到业务逻辑对象中。

我的应用程序变得更加复杂,我正在寻找一种现代化、更新的处理以下情况的方法。我知道可以使用低级别的ADO.NET组件,如SqlDataReader手动映射结果,但我相信使用Entity Framework 6有更好的方法。

问题是:使用此命令dbContext.Database.SqlQuery<MyClass>,我无法处理:

  1. 返回2个结果集的存储过程

  2. 将结果集映射到复杂数据类型

示例:

public class Order
{
    public Customer customer { get; set; }
    public Items[] items { get; set; }
}

我知道可以手动映射或使用AutoMapper,但我正在寻找基于Entity Framework 6的“最新”方法。

1个回答

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 class Order { public Customer customer { get; set; } public int OrderId { get; set; } }

最好在你的 Order 表格中使用 CustomerId 引用 Customer 表格,而不是使用 FirstName/LastName。这将是一次良好的重构,规范化数据库。否则,你将没有真正的映射对象和数据库之间的关系,因为你的 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}};

1
我该如何将结果中的几列映射到第二级复杂类型?例如:选择名字, 姓氏, 订单编号从订单我想将其映射到:公共类订单 { 公共客户客户{获取;设置;} 公共int OrderId {获取;设置;} } - Omtechguy
你能帮忙解决上述问题吗? - Omtechguy
你的意思是想在Order中使用FirstName和LastName创建一个Customer对象吗? - Francesco B.
1
最好在您的订单表中使用一个CustomerId,引用一个Customer表,而不是使用FirstName/LastName。这将是一个很好的重构,规范化数据库。否则,您将无法真正映射对象和数据库,因为您的Order对象将具有一个在数据库中不存在的Customer属性。在这种情况下,您将不得不创建一个类,例如NormalizedOrder,然后var NormalizedOrders = Orders.Select new Order(){OrderId = e.OrderId, Customer = new Customer(){FirstName=>e.FirstName,LastName=>e.LastName}}; - Francesco B.
1
@ Francesco,我已经标记了答案,请您将其添加到原始答案中,这样就是完整的答案了。 - Omtechguy
https://www.khalidabuhakmeh.com/entity-framework-6-multiple-result-sets-with-stored-procedures - Omtechguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接