変更追跡に CTP5 DBContext を使用して EntityObject と同じ動作を再現しようとしています。テーブル Movie と Director を考えてみましょう。関係は、映画の場合は 1 人の監督のみであり、各監督の場合は複数の映画です。
var movie = new Movie();
movie.Name = "ABCD";
ctx.Movies.Add(movie);//ctx.Movies.AddObject(movie);
movie.Director = new Director() { Name = "dir1" };
var existingDirector = ctx.Directors.Where(a => a.Name == "dir2").FirstOrDefault();
movie.Director = existingDirector;
ctx.SaveChanges();
EntityObject を使用してこれを実行すると、変更が追跡されるため、このコードによって新しいディレクター「dir1」が作成されます。CTP 5 DbContext ジェネレーターを使用してこのコードを実行すると、新しいディレクター "dir1" が作成されません。Movie オブジェクトと Director オブジェクトの両方でプロパティを仮想に変更しました。以下はコードです。
public partial class Director
{
public Director()
{
//this.Movies = new HashSet<Movie>();
}
// Primitive properties
public virtual int DirectorId { get; set; }
public virtual string Name { get; set; }
// Navigation properties
public virtual ICollection<Movie> Movies { get; set; }
}
public partial class Movie
{
public Movie()
{
//this.Actors = new HashSet<Actor>();
}
// Primitive properties
public virtual int MovieId { get; set; }
public virtual Nullable<int> DirectorId { get; set; }
public virtual string Name { get; set; }
// Navigation properties
public virtual Director Director { get; set; }
}
3 つの質問があります。
- ここで何か不足していますか?すべてのプロパティを「仮想」に保ちましたが、オブジェクトは追跡されていません。なんで?
- EF4 POCO で行われたように、"Association fixup" ロジックを記述する必要がありますか?
- もしそうなら、DbContext T4 ジェネレーターで Association fixup コードが削除されたのはなぜですか?