实体框架数据集映射

时间:2018-03-04 08:28:29

标签: c# asp.net entity-framework entity-framework-6

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

我的申请变得更加复杂,我正在寻找一个现代化的,#34;最新的"处理以下情况的方法。我知道我可以使用像SqlDataReader这样的低级ADO.NET组件来实现这一点,并手动映射结果,但我确信使用Entity Framework 6是最好的方法。

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

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

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

  3. 示例:

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

    同样,我知道我可以手动或使用AutoMapper进行映射,但我正在寻找最新的&#34;最新的&#34;基于实体框架6的方法。

1 个答案:

答案 0 :(得分:2)

是的,有一种方法可以使用 Translate

改编自official documentation

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