4

私は次のクラスを持っています。ドメイン モデルはエンティティ フレームワークによって作成され、私は POCO を使用しています。

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedDate{ get; set; }
    public DateTime ModifiedDate{ get; set; }
    public virtual ICollection<Order> Orders{ get; set; }
}

public class CustomerDTO
{

    public int Id { get; set; }
    public string Name{ get; set; }
    public List<OrderDTO> Orders{ get; set; }
}

public class Order
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int ProductId { get; set; }
    public DateTime CreatedDate{ get; set; }
    public DateTime ModifiedDate{ get; set; }
}

public class OrderDTO
{
    public int Id { get; set; }
    public string Name{ get; set; }
}

次のマッピングを試しました。

Mapper.CreateMap<Customer, CustomerDTO>();
Mapper.CreateMap<CustomerDTO, Customer>();
Mapper.CreateMap<Order, OrderDTO>();
Mapper.CreateMap<OrderDTO, Order>();

私も試してみました

Mapper.CreateMap<CustomerDTO, Customer>().ForMember(c => c.Orders,
            m => m.MapFrom
            (
                q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders)
            )
        );

顧客を更新するために、DB から取得し、customerDTO で更新します

Customer customer = _customerRepository.GetById(customerDTO.Id);
Mapper.Map<CustomerDTO, Customer>(customerDTO, customer);

顧客オブジェクトは正しく更新されており、作成日と変更日は変更されていません。しかし、注文リストの各注文は正しく更新されていません。その productId、作成日、変更日は、データベースから取得した値ではなく、デフォルト値に設定されています。

Orders は仮想コレクションであるため、他に何かする必要がありますか?

私は自動マッパーを初めて使用しますが、助けていただければ幸いです。

編集

追加した

Mapper.AssertConfigurationIsValid();

アプリの起動時に次のエラーを受け取りました: マップされていないメンバーが見つかりました。以下のタイプとメンバーを確認してください。カスタム マッピング式の追加、無視、カスタム リゾルバーの追加、またはソース/宛先タイプの変更

マッピングを次のように更新しました。

Mapper.CreateMap<OrderDTO, Order>()
                .ForMember(x => x.CreatedDate, y => y.Ignore())
                .ForMember(x => x.ModifiedDate, y => y.Ignore())
                .ForMember(x => x.ProductId, y => y.Ignore())

しかし、注文にはまだ上記のプロパティがデフォルト値によって上書きされています

4

1 に答える 1

2

それが正しい解決策か最善の解決策かはわかりませんが、マッピングで変更してみてください

q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders)

q => Mapper.Map<List<OrderDTO>, ICollection<Order>>(q.Orders, c.Orders)

これは、注文を上書きするのではなく、更新する必要があります (顧客マップと同様)。

以下を使用するだけでも十分であることに注意してください。

q => Mapper.Map(q.Orders, c.Orders)

余談:

また、些細なことですが、ドキュメントと同様の規則を使用すると、マッピングが読みやすくなります。:

// Configure AutoMapper
Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
    .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.EventDate.Date))
    .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.EventDate.Hour))
    .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.EventDate.Minute));
于 2012-11-03T02:30:43.260 に答える