Я только недавно начал использовать Entity Framework 1.0 и считаю, что я начинаю ощущать боли, о которых все говорят. Я пытаюсь использовать лучшие практики, поэтому у меня есть набор DTO, который сопоставляется с моими объектами с помощью AutoMapper.Entity Framework, AutoMapper, обновления для обработки объектов
Настоящий улов - это когда я пытаюсь обновить объект. Первым было то, что я не мог найти способ создания нового объекта, переноса данных из моего DTO и все еще иметь объект ObjectContext, который понимает, что он был изменен. Я использовал следующий код:
public VideoDTO UpdateVideo(VideoDTO pVideo)
{
Video video = new Video();
Mapper.Map(pVideo, video);
context.Attach(video); //Successfully attaches
context.ApplyPropertyChanges("Videos", video); // no changes made as far as entity knows b/c it was attached in it's updated state
context.SaveChanges(); //doesn't save the entity
return pVideo;
}
тогда я фигурировал, возможно, мне нужно просто захватить объект из базы данных первым, прикрепить к контексту, вызовите метод Карты на Mapper, а затем вызвать SaveChanges. Вот что я сделал:
public VideoDTO UpdateVideo(VideoDTO pVideo)
{
Video video = context.Videos.Where(v => v.VideoId == pVideo.VideoId).FirstOrDefault();
Mapper.Map(pVideo, video); //Error here: Can't change VideoId value on Video entity
//context.Attach(video);
//context.ApplyPropertyChanges("Videos", video);
context.SaveChanges();
return pVideo;
}
Теперь мы перейдем к прекрасной EF вопросу не разрешено изменять свойство, VideoID, так как он используется в свойстве EntityKey на видео сущности. Прекрасный. Я настроил сопоставления, так что, когда я сопоставил свой DTO с EF Entity, свойство EntityKey получит значение. Теперь мне нужен способ сделать исключение для этого правила сопоставления, но не знаю, с чего начать. Я полагаю, что я мог бы создать совершенно новое правило сопоставления прямо в этом методе и установить свойства EntityKey & VideoId, которые будут игнорироваться, но это кажется довольно неряшливым. Кроме того, я не уверен, что создание, созданное на этом этапе, будет придерживаться. Если он переопределит начальную настройку, которая позволила DTO сопоставить значение EntityKey на объекте, это могло бы иметь обратные последствия совершенно другим способом.
У кого-нибудь есть идея?
jfar: Спасибо за ваш ответ. Прежде всего, что вы имеете в виду AFAIK AutoMapper? Я имею в виду AutoMapper здесь: http://code.google.com/p/automapperhome/. Что касается PK Mapping, я говорю об определении всех сопоставлений в одном месте и не засоряя мой код операторами .CreateMap во всем коде. Проблема здесь в том, что мне нужно косвенно сопоставить мой DTO с моим Entity по-разному в зависимости от того, создаю ли я новую запись в своем db или обновляю запись в своем db. Больше на AutoMapper за секунду ... закончилось символов ... – jason
Хорошо, вы упомянули, что Automapper не предназначался для перехода из DTO -> EF Entity, но должен был быть только EF -> DTO. Если это так, как я должен обновлять свою базу данных через объекты EF, когда объекты, используемые в моем представлении и контроллере, являются объектами DTO? Я не пытаюсь быть снисходительным или чем-то еще. Я просто пытаюсь найти правильный способ обработки вставок и обновлений, не привязывая мое приложение к конкретной реализации доступа к данным. Я открыт для любых предложений, которые у вас могут быть. – jason
AFAIK = насколько я знаю, извините за неясность – jfar