c# - 如何映射多对多关系?

标签 c# model-view-controller many-to-many automapper

如何映射多对多关系?

一对一关系很简单....

假设...

public class ProductDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int SupplierId { get; set; }
}

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Cost { get; set; }
    public Supplier Supplier { get; set; }
}

public class Supplier
  {
    public int Id { get; set; }
    public string Name { get; set; }
    public int Rating { get; set; }
    public ICollection<Product> Products { get; set; }
}

 Mapper.CreateMap<Product, ProductDTO>()
            .ForMember(d => d.SupplierId, m => m.MapFrom(s => s.Supplier.Id));

假设每个产品只有一个供应商,而一个供应商可以有多个产品。如果一个产品也可以有很多供应商,我该如何映射它?

我将产品中的供应商行更改为

 public ICollection<Supplier> Supplier { get; set; }

并且在 ProductDTO 中做同样的事情

 public ICollection<int> SupplierId { get; set; }

既然 ID 现在是集合,我该如何更改 CreateMap?自动完成不再显示 Id,我得到的只是函数。

我是 C# 的新手,所以我遗漏了很多明显的东西。我是否应该在 for 循环中迭代并逐个映射 ID?

最佳答案

您可以尝试使用:

Mapper.CreateMap<Product, ProductDTO>()         
      .ForMember(d => d.SupplierIds, m => m.MapFrom(p => p.Suppliers.Select(s => s.Id)));

另一种选择:

Mapper.CreateMap<Supplier, int>().ConvertUsing(s => s.Id);
Mapper.CreateMap<Product, ProductDTO>()                                
   .ForMember(d => d.SupplierIds, m => m.MapFrom(p => p.Suppliers));

还有一件事,如果您使用 DTO 从 Web/WCF 服务传递数据,您可以考虑使用

public ICollection<SupplierDTO> Supplier { get; set; }

如果仅传递供应商 ID,则改为。在大多数情况下,在对服务的一次调用中传递更多数据比进行几次调用更好(也更有效)。

关于c# - 如何映射多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13839914/

相关文章:

c# - C#中一个简单线程池的代码

jquery - 在4.0.3 js中使用远程源时如何在Select2中设置值

c# - AcquireTokenByAuthorizationCode 使用 Azure Active Directory 在使用 ASP.NET MVC 的单租户应用程序中引发新异常

javascript - 如何通过 SignalR 将 javascript 对象从一个客户端发送到另一个客户端

c# - 每个托管线程是否都有自己对应的 native 线程?

c# - 保持 Canvas 元素相对于背景图像定位

c# - Windows 服务仅运行列出的第一个服务

mysql - 多对多hibernate映射和mysql脚本-持久化问题

java - 具有急切加载问题的 Hibernate 多对多

java - Hibernate:ManyToMany单向仅返回一条记录