私は最近EntityFramework1.0を使い始めたばかりで、誰もが話している苦痛を感じ始めていると思います。ベストプラクティスを使用しようとしているので、AutoMapperを介してエンティティとの間でマッピングされる一連のDTOがあります。
本当の問題は、オブジェクトを更新しようとしているときです。最初の落とし穴は、新しいエンティティを作成し、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のMapメソッドを呼び出してから、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;
}
ここで、VideoエンティティのEntityKeyプロパティによって使用されるため、プロパティVideoIdの変更が許可されないというEFの問題が発生します。素晴らしい。DTOからEFエンティティにマッピングするときに、EntityKeyプロパティが値を取得するようにマッピングを設定しました。ここで、そのマッピングルールに例外を設ける方法が必要ですが、どこから始めればよいかわかりません。このメソッドでまったく新しいマッピングルールを作成し、EntityKeyとVideoIdのプロパティを無視するように設定できると思いますが、それはかなりお粗末なようです。さらに、この時点で作成されたマッピングが固執するかどうかはわかりません。DTOがエンティティのEntityKeyに値をマップできるようにする初期設定を無効にすると、まったく異なる方法で逆効果になります。
誰かもっと良いアイデアがありますか?