Я только недавно начал использовать 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 Entity свойство EntityKey получало значение. Теперь мне нужен способ сделать исключение из этого правила сопоставления, но я не знаю, с чего начать. Полагаю, я мог бы создать совершенно новое правило сопоставления прямо в этом методе и настроить игнорирование свойств EntityKey и VideoId, но это кажется довольно небрежным. Более того, я не уверен, что созданное на этом этапе сопоставление приживется. Если он переопределит первоначальную настройку, которая позволила DTO сопоставить значение с EntityKey на объекте, это приведет к обратным результатам совершенно по-другому.
У кого-нибудь есть идея получше?