2016-02-09 10 views
7
public class Person 
{ 
    Name { get; set; } 
    IEnumerable<Address> Addresses { get; set; } 
} 

public class PersonModel 
{ 
    Name { get; set; } 
    IEnumerable<AddressModel> Addresses { get; set; } 
} 

Nếu tôi lập bản đồ Person-PersonModel như vậy:Automapper trả lại một bộ sưu tập sản phẩm nào, tôi muốn một null

Mapper.DynamicMap<Person, PersonModel>(person); 

Nếu Addresses tài sản trên Person là null họ được ánh xạ trên PersonModel như một sản phẩm nào Enumerable thay của null.

Làm cách nào để nhận được PersonModel để có số trống Addresses thay vì để trống Enumerable?

+1

Tại sao 'Bản đồ động' trên' Bản đồ'? – CodingGorilla

+0

Vâng, đây là một lỗi khủng khiếp trong AutoMapper. Nếu bạn có một thực thể tại EF, nơi bạn đang tải một bộ sưu tập một cách rõ ràng? Bạn quyết định rằng bạn không cần phải tải bộ sưu tập và sau đó bạn lưu dữ liệu sau khi ánh xạ đối tượng từ dto của bạn đến loại EF xóa thông tin vĩnh viễn khi lưu. – jwize

+0

Không chỉ này, nhưng chúng tôi đã sử dụng ảo trên bộ sưu tập của chúng tôi. Khi chúng tôi chuyển sang xóa tất cả các thuộc tính ICollection ảo, chúng tôi đã bị mất dữ liệu lớn. – jwize

Trả lời

6

Vì vậy, có lẽ một số cách bạn có thể thực hiện điều này với Automapper, và điều này chỉ là một:

Mapper.CreateMap<Person, PersonMap>() 
    .AfterMap((src, dest) => dest.Addresses = dest.Addresses?.Any() ? dest.Addresses : null); 

Mã này sử dụng c mới # ?. điều hành cho sự an toàn null, vì vậy bạn có thể cần phải loại bỏ và kiểm tra null nếu bạn không thể sử dụng tính năng đó trong mã của bạn.

+0

Đây có phải là cách tốt nhất không? Cách chính xác nhất? Cũng không cho phép tôi sử dụng Mapper.DynamicMap. – c0D3l0g1c

+1

Tùy thuộc vào hoàn cảnh của bạn, nếu bạn đang sử dụng tính năng chiếu của Automapper, tính năng này không hoạt động (hoặc không phải lần cuối tôi sử dụng Automapper). Nếu bạn chỉ làm một mô hình duy nhất tại một thời điểm, thì điều này hoàn toàn có thể chấp nhận được [với tôi]. – CodingGorilla

+0

@ c0D3l0g1c Tôi đã hỏi trong một nhận xét về câu hỏi tại sao bạn muốn DynamicMap, có lý do cụ thể nào không? – CodingGorilla

1

Bạn sẽ có thể xác định trình phân giải tùy chỉnh cho thuộc tính bạn muốn hoạt động này. Vì vậy, một cái gì đó như:

Mapper.CreateMap<Address, AddressModel>(); 
Mapper.CreateMap<Person, PersonModel>() 
    .ForMember(
     dest => dest.Addresses, 
     opt => opt.ResolveUsing(person => person.Addresses.Any() ? person.Addresses.Select(Mapper.Map<Address, AddressModel>) : null)); 
1

Một lựa chọn khác là sử dụng điều kiện, vì vậy chỉ ánh xạ giá trị khi giá trị không rỗng. này có thể yêu cầu mặc định giá trị null (vì nó wont được ánh xạ)

Mapper.CreateMap<Person, PersonModel>() 
.ForMember(
    dest => dest.Addresses, 
    opt => opt => opt.Condition(source=> source.Addresses!= null)); 
2

Câu trả lời đơn giản là sử dụng AllowNullCollections:

AutoMapper.Mapper.Initialize(cfg => 
{ 
    cfg.AllowNullCollections = true; 
}); 

hoặc nếu bạn sử dụng API dụ

new MapperConfiguration(cfg => 
{ 
    cfg.AllowNullCollections = true; 
} 
+0

Đây phải là câu trả lời đúng, đã tiết kiệm thời gian cho tôi, cảm ơn bạn. –

Các vấn đề liên quan