Код Automapper и Entity Framework сначала не работает должным образом - PullRequest
1 голос
/ 05 октября 2011

Я пытаюсь использовать Automapper с кодом Entity Framework First 4.1. Я не могу получить сохранение / обновление, чтобы работать правильно 100% времени.

Первая проблема - если я не использую UseDestinationValue() для объекта, тогда мой DTO не будет сопоставлять его свойства с сущностью. Затем, если я не использую UseDestinationValue(), динамически созданный прокси-объект теряет некоторые свойства, а свойство Address получает новую сущность при каждом обновлении.

Mapper.CreateMap<GymModel, Gym>(); <-- loses Entity Framework proxy properties for update, works fine on insert

или

Mapper.CreateMap<GymModel, Gym>()
.ForAllMembers(q => q.UseDestinationValue()); <-- Doesn't map DTO to Entity

и / или это тоже не работает

var gym = Mapper.CreateMap<GymModel, Gym>();
            gym.ForAllMembers(q => q.UseDestinationValue());
            gym.ForMember(q => q.DateCreated, o => o.MapFrom(s => s.DateCreated));

Услуги

public void Save(GymModel model)
{
    var item = new Gym()
    {
        Address = new Address()
    };

    if (model.Id > 0)
    {
        Expression<Func<Gym, bool>> where = q => q.Id == model.Id;
        Expression<Func<Gym, object>> address = q => q.Address;

        item = _gymsRepository.Get(new [] { address }, where);
    }

    model.Address.Id = item.AddressId;

    Mapper.Map(model, item);

AddressModel

public class AddressModel : IAddressModel
    {
        public int Id { get; set; }
        public string Location { get; set; }
        public string StreetAddress { get; set; }
        public string ExtendedAddress { get; set; }
        public string City { get; set; }
        public string StateRegion { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }

        public double? Latitude { get; set; }
        public double? Longitude { get; set; }
}

Адрес

[Table("Address", Schema = "GrassrootsHoops")]
    public class Address
    {
        [Key]
        public int Id { get; set; }
        public string Location { get; set; }
        public string StreetAddress { get; set; }
        public string ExtendedAddress { get; set; }
        public string City { get; set; }
        public string StateRegion { get; set; }
        public string PostalCode { get; set; }
        public string Country { get; set; }

        public double? Latitude { get; set; }
        public double? Longitude { get; set; }
    }

1 Ответ

0 голосов
/ 06 октября 2011

Я пошел дальше и сделал это ниже, и он перестал воссоздавать новый адрес на вставке. Если кто-нибудь знает лучший способ без явного указания адреса на карту и игнорирования его на родительском, пожалуйста, опубликуйте его.

        Mapper.Map(model, item);
        Mapper.Map(model.Address, item.Address);

Mapper.CreateMap<GymModel, Gym>()
.ForMember(d => d.Address, o => o.Ignore());
...