实体框架数据集映射
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架数据集映射相关的知识,希望对你有一定的参考价值。
我的所有DAL函数都使用dbContext.Database.SqlQuery
将存储过程结果映射到业务逻辑对象中。
我的应用程序变得更加复杂,我正在寻找一种现代的,“最新”的方式来处理以下情况。我知道我可以使用像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进行映射,但我正在寻找基于Entity Framework 6的“最新”方法。
是的,有一种方法使用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;组; } 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}};
以上是关于实体框架数据集映射的主要内容,如果未能解决你的问题,请参考以下文章