2

多対多の関係をどのようにマッピングしますか?

1対1の関係は簡単です....

仮定すると...

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));

すべての製品に 1 つのサプライヤーしかなく、1 つのサプライヤーが多くの製品を持つことができると仮定して機能します。製品に多くのサプライヤーがいる可能性がある場合、どのようにマッピングすればよいですか?

製品のサプライヤー行を次のように変更しました

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

そしてProductDTOで同じことをしています

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

Id がコレクションになったので、CreateMap を変更するにはどうすればよいですか? オートコンプリートに Id が表示されなくなり、取得できるのは関数だけです。

私はC#を初めて使用するので、明らかな何かが欠けていることがよくあります。for ループを反復処理して、ID を 1 つずつマップする必要がありますか?

4

1 に答える 1

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サービスからデータを渡す場合は、もう1つ使用を検討してください。

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

代わりに、サプライヤIDのみを渡す場合。ほとんどの場合、数回の呼び出しを行うよりも、1回の呼び出しでより多くのデータをサービスに渡す方が適切です(そしてより効果的です)。

于 2012-12-12T13:09:15.933 に答える