你如何映射多对多的关系?

时间:2012-12-12 12:34:43

标签: 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; }

如何更改CreateMap,因为ID现在是集合?自动填充不再显示ID,我得到的只是功能。

我是C#的新手,所以我很多人都错过了一些明显的东西。我是否应该在for循环中迭代并逐个映射id?

1 个答案:

答案 0 :(得分:1)

您可以尝试使用:

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。在大多数情况下,在一次调用中传递更多数据比调用少量调用更好(也更有效)。