实体框架数据集映射

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架数据集映射相关的知识,希望对你有一定的参考价值。

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

我的应用程序变得更加复杂,我正在寻找一种现代的,“最新”的方式来处理以下情况。我知道我可以使用像SqlDataReader这样的低级ADO.NET组件来实现这一点并手动映射结果,但我确信使用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的“最新”方法。

答案

是的,有一种方法使用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 class Order {public Customer customer {get;组; } public int OrderId {get;组; }}

最好的方法是在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}};

以上是关于实体框架数据集映射的主要内容,如果未能解决你的问题,请参考以下文章

实体框架6不适用于Temporal表

实体框架代码首先自定义字段,我不想映射到数据库

更新映射到视图的实体框架实体

使用实体框架映射数据库的方法?

实体框架 4.1 代码优先映射到将主键作为外键列的表

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段