gpt4 book ai didi

c# - 将 Entity Framework 模型导航属性转换为 DTO

转载 作者:可可西里 更新时间:2023-11-01 08:41:27 25 4
gpt4 key购买 nike

我目前正在从事一个 n 层网络项目。在研究了数据传输对象及其好处之后,我们决定试一试这种模式。我们的 ASP.NET MVC 网站无法直接访问 EF DbContext,而是使用 DTO 发送和接收实体数据。将有一个服务/映射层,将在 DTO 和实体模型之间进行转换。

我的问题是,将实体模型导航属性转换为其 DTO 的最佳方式是什么?

下面是项目中实体模型及其 DTO 的示例:

实体模型:

public class Payment
{
public int ID { get; set; }
public DateTime? PaidOn { get; set; }
public decimal Amount { get; set; }
public string Reference { get; set; }

//Navigation Properties
public virtual PaymentMechanism PaymentMechanism { get; set; }
public virtual ICollection<Order> Orders { get; set; }
}

DTO:

public class PaymentDto
{
public int ID { get; set; }
public DateTime? PaidOn { get; set; }
public decimal Amount { get; set; }
public string Reference { get; set; }

//--------Navigation Properties - Object Ids--------
public int PaymentMechanismId { get; set; }
public ICollection<int> OrderIds { get; set; }
}

可以看出,除了导航属性外,它们非常相似。我已将它们更改为包含(实体的)整数 ID 而不是实体模型。因此,如果需要获取导航属性实体,则可以将它们的 ID 传递到服务/映射层函数,该函数将从数据库中检索实体,将它们映射到 DTO 并返回集合。这是一种可以接受的做事方式吗?

我是这个领域的新手,所以我的一些术语可能不完全正确,但希望你能理解我的意思。如果您需要我澄清或提供任何其他详细信息,请告诉我。

最佳答案

您可以使用投影加载 DTO:

var paymentDtos = context.Payments
.Where(p => p.Amount >= 1000m) // just an example filter
.Select(p => new PaymentDto
{
ID = p.ID,
PaidOn = p.PaidOn,
Amount = p.Amount,
Reference = p.Reference,
PaymentMechanismId = p.PaymentMechanism.ID,
OrderIds = p.Orders.Select(o => o.ID)
})
.ToList();

您必须声明 OrderIds在 dto 中为 IEnumerable<int>虽然,不像ICollection<int>进行编译。

我不确定这个 key 收藏是否真的有用。如果您想稍后加载订单,您可以在基于 ID 的单独服务方法中完成。的 Payment ,像这样:

public IEnumerable<OrderDto> GetPaymentOrders(int paymentID)
{
return context.Payments
.Where(p => p.ID == paymentID)
.Select(p => p.Orders.Select(o => new OrderDto
{
ID = o.ID,
//etc. mapping of more Order properties
}))
.SingleOrDefault();
}

关于c# - 将 Entity Framework 模型导航属性转换为 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com