我想重現與使用CTP5 DBContext進行更改跟蹤的EntityObject相同的行爲。考慮表格電影和導演。關係只有一位電影導演和每位導演多部電影。EntityFramework CTP5更改跟蹤
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生成器中刪除了關聯修復代碼?
該代碼是愚蠢的,但我想顯示EntityObject和DbContext T4生成器之間的差異。重點是與EntityObject生成器相同的代碼(沒有註釋行)在db中創建「dir1」,而POCO或DbContext生成器不創建。爲什麼?更改跟蹤發生了什麼? – Jonna 2011-02-10 22:47:13