我正在尝试使用 CTP5 DBContext 重现与 EntityObject 相同的行为以进行更改跟踪。考虑电影和导演表。关系是一部电影只有一位导演,每位导演有多部电影。
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 生成器中删除了关联修复代码?