J'essaie de reproduire le même comportement que EntityObject en utilisant CTP5 DBContext pour le suivi des modifications. Considérez les tables Movie et Director. La relation est seulement 1 directeur pour un film et plusieurs films pour chaque réalisateur.EntityFramework CTP5 suivi des modifications
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();
Si je cours en utilisant ce EntityObject, ce code créerait un nouveau directeur « dir1 » que les changements sont suivis. Si je cours ce code en utilisant le générateur DbContext CTP 5, le nouveau directeur "dir1" n'est pas créé. J'ai changé les propriétés pour être virtuel dans les deux objets Movie et Director. Voici le code.
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; }
}
J'ai 3 questions.
- Est-ce que je manque quelque chose ici? Même si j'ai gardé "virtuel" pour chaque propriété, l'objet n'est pas suivi. Pourquoi?
- Dois-je écrire une logique de "correction d'association" comme cela a été fait dans les POCO EF4?
- Si oui, pourquoi le code de correction d'association a-t-il été supprimé dans le générateur DbContext T4?
Le code est bête, mais je voulais montrer une divergence entre les générateurs EntityObject et DbContext T4. Le point est avec le générateur EntityObject le même code (sans commenter la ligne) crée le "dir1" dans db alors que le générateur POCO ou DbContext ne le fait pas. Pourquoi? Qu'est-ce qui s'est passé pour changer le suivi? – Jonna
Veuillez lire ma réponse mise à jour. –