Я только недавно начал использовать Entity Framework 1.0 и считаю, что начинаю чувствовать боль, о которой все говорят.Я пытаюсь использовать лучшие практики, поэтому у меня есть набор DTO, которые отображаются на и из моих сущностей через 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;
}
Затем я решил, что, возможно, мне нужно просто сначала извлечь объект из базы данных, присоединить его к контексту, вызвать метод Map в 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 в сущности Video.Прекрасный.Я настроил сопоставления таким образом, чтобы при сопоставлении моего DTO с объектом EF свойство EntityKey получало значение.Теперь мне нужен способ сделать исключение из этого правила отображения, но я не знаю, с чего начать.Я полагаю, что я мог бы создать совершенно новое правило Mapping прямо в этом методе и установить свойства EntityKey и VideoId, которые будут игнорироваться, но это выглядит довольно неаккуратно.Кроме того, я не уверен, что созданное в этот момент отображение будет придерживаться.Если он отменяет первоначальную настройку, которая позволяет DTO отображать значение на EntityKey на объекте, это может иметь обратный эффект совершенно другим способом.
У кого-нибудь есть идея получше?