Entity Framework: ajout d’un POCO enfant existant à un nouveau POCO parent, création d’un nouvel enfant dans la firebase database

Je veux utiliser Entity Framework POCO en mode déconnecté (hors contexte). Dans mon scénario, je crée un nouvel object parent et je souhaite y associer un object enfant existant, puis l’enregistrer dans la firebase database.
Le code ci-dessous insère de manière indésirable un nouvel enregistrement de cours lors de l’enregistrement d’un nouvel enregistrement d’étudiant, alors que je souhaite plutôt que l’enregistrement de cours existant soit lié au nouvel enregistrement d’étudiant.

Comment puis-je faire cela dans Entity Framework où …

  • les objects peuvent être déconnectés du contexte. (c.-à-d. interrogé dans un contexte et ensuite sauvegardé dans un contexte différent)
  • Je n’ai pas besoin de réinterroger l’enregistrement enfant à partir de la firebase database pour pouvoir l’attacher au parent lorsque je sauvegarde sur db. Je veux vraiment éviter de faire des voyages supplémentaires à la firebase database quand je l’ai déjà en tant qu’object en mémoire.

Cette page montre un schéma de firebase database dont le code ci-dessous est basé http://entityframeworktutorial.net/EF4_EnvSetup.aspx#.UPMZ4m-UN9Y

class Program { static void Main(ssortingng[] args) { //get existing course from db as disconnected object var course = Program.getCourse(); //create new student var stud = new Student(); stud.StudentName = "bob"; //assign existing course to the student stud.Courses.Add(course); //save student to db using (SchoolDBEntities ctx = new SchoolDBEntities()) { ctx.Students.AddObject(stud); ctx.SaveChanges(); } } static Course getCourse() { Course returnCourse = null; using (var ctx = new SchoolDBEntities()) { ctx.ContextOptions.LazyLoadingEnabled = false; returnCourse = (from s in ctx.Courses select s).SingleOrDefault(); } return returnCourse; } } 

Je crois qu’il y a peu de moyens d’accomplir cela. Vous pouvez spécifier que l’entité du cours est inchangée plutôt que ajoutée, dans l’ordre suivant:

 ctx.Entry(course).State = EntityState.Unchanged; 

Ou indiquez à votre contexte que vous travaillez avec une entité existante:

 ctx.Courses.Attach(course); 

Plus d’informations ici: http://msdn.microsoft.com/en-us/data/jj592676.aspx

MODIFIER

Certains échantillons de ma solution fonctionnent, j’ai vérifié qu’ils fonctionnaient comme prévu. Dans tous les cas, nous avons un enregistrement Publisher dans la firebase database avec ID = 2 et Name = “Addison Wesley” (non pertinent pour l’exemple, mais pour faire bonne mesure).

Approche 1 – Définition de l’état de l’entité

 using (var context = new Context()) { var book = new Book(); book.Name = "Service Design Patterns"; book.Publisher = new Publisher() {Id = 2 }; // Only ID is required context.Entry(book.Publisher).State = EntityState.Unchanged; context.Books.Add(book); context.SaveChanges(); } 

Approche 2 – Utilisation de la méthode Attach

 using (var context = new Context()) { var book = new Book(); book.Name = "Service Design Patterns"; book.Publisher = new Publisher() { Id = 2 }; // Only ID is required context.Publishers.Attach(book.Publisher); context.Books.Add(book); context.SaveChanges(); } 

Approche 3 – Définition de la valeur de la clé étrangère

 using (var context = new Context()) { var book = new Book(); book.Name = "Service Design Patterns"; book.PublisherId = 2; context.Books.Add(book); context.SaveChanges(); } 

Pour que cette dernière approche fonctionne, je devais append une propriété supplémentaire PublisherId, elle doit être nommée conformément à la convention NavigationPropertyName + ‘Id “pour pouvoir être récupérée par EF au moins:

 public int PublisherId { get; set; } public Publisher Publisher { get; set; } 

J’utilise ici le code EF5 en premier, mais il est très similaire à POCO.

Entity Framework n’autorise pas les relations entre contextes.

Si vous placez la lecture du cours et connectez le cours à l’étudiant dans le même énoncé d’utilisation, cela fonctionnera.

J’ai aussi essayé la deuxième option, cela a fonctionné pour moi. J’ai bien aimé que la relation parent-> enfant se produise d’abord au niveau de l’object, puis enregistre dans la firebase database. Peut-être devrais-je simplement supprimer toutes les relations entre les entités générées par EF et les contrôler moi-même manuellement.