Я пытаюсь воспроизвести то же поведение, что и EntityObject, используя CTP5 DBContext для отслеживания изменений. Рассмотрим таблицы 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?
- Если да, то почему код исправления ассоциации был удален в генераторе DbContext T4?