2017-09-06 8 views
1

私は最近、再びこの記事を読ん:顧客、すなわち顧客とCustomerDtoのための2つの別々のオブジェクトが存在することをマッピング複数のクラス

public class CustomerRepository 
{ 
    public void Save(Customer customer) { /* … */ } 
    public Customer GetById(int id) { /* … */ } 
    public IReadOnlyList<CustomerDto> Search(string name) { /* … */ } 
} 

お知らせ:http://enterprisecraftsmanship.com/2015/04/20/types-of-cqrs/ をタイプ1から以下のコードを見てください。私は、エンティティフレームワークは1つのエンティティを1つのクラスにマッピングすることしかできないと考えています。上のコードはどのようにして得られますか?

+0

[DTO](https://martinfowler.com/eaaCatalog/dataTransferObject.html)クラスはデータベースに保存されません。プロパティはエンティティにマップされます。 – Jasen

+0

@Jason、Searchメソッドでオートマッペのようなツールを使用してCustomerDtoにCustomerをマッピングすると言っていますか? – w0051977

+1

DTOは通常、エンティティに直接マッピングされないクラスです。受信者がEFまたはバックエンドデータストアへの参照を必要とせずにオブジェクトを転送する方法を提供します。したがって、EFは上記のコードに対応する必要はありません。 –

答えて

1

クラスはデータベースに保存されません。プロパティはエンティティにマップされます。

var query = db.Customer.First(c => c.id == id); 
var customerDto = Map<CustomerDto>(query); 

リポジトリは、クライアントにDTOクラスを公開します。実装の詳細はエンティティを使用します。これにより、データレイヤー内のEFが分離されます。

DTOプロパティは、エンティティへの1:1マッピングではないかもしれません - 比較的フラットなDTOに関与する多くのエンティティクラスが存在する可能性があります。

public class CustomerInfoDto 
{ 
    public int CustomerId { get; set; } 
    // ... some customer properties 
    public int CustomerExtendedId { get; set; } 
    // ... some additional properties 
} 

var info = from c in db.Customers 
      join e in db.CustomerExtended on c.Id equals e.CustomerId 
      select new CustomerInfoDto 
      { 
       CustomerId = c.Id, 
       Name = c.Name, 
       CustomerExtendedId = e.Id, 
       LastAccess = e.LastAccess 
      }; 
関連する問題