2013-03-05 3 views
1

J'utilise EF5, première approche de base de données POCO. Disons que je dois créer un nouveau client et un nouvel ordre: -Entity Framework 5 POCOs - créer et gérer des relations

var customer = new Customer(); 
var order = new Order(); 

order.Customer = customer; 
order.CustomerId = customer.Id; 

customer.Orders.Add(order); 

Dois-je vraiment inclure ces trois dernières lignes pour mettre en place la relation? La chose à signaler ici est que je crée la hiérarchie d'entité en mémoire, et la manipule pendant potentiellement longtemps jusqu'à ce que l'utilisateur frappe "Enregistrer".

Ce qui m'embrouille, c'est l'idée de créer plusieurs nouveaux objets Client. Chacun se terminera avec un ID de 0 (avant d'être persisté). Il y a plusieurs endroits dans mon code où je fais quelque chose avec la propriété CustomerId d'une commande. S'il y a plusieurs nouveaux clients (ID 0), comment puis-je obtenir le bon? Ou dois-je toujours utiliser Order.Customer et jamais Order.CustomerId (dans ce cas, est-il sûr de se débarrasser de l'attribution ID dans le code ci-dessus)?

Répondre

1

Lorsque vous ajoutez un nouveau client, un graphique complet est inséré et les relations sont configurées de manière appropriée. Vous n'avez pas besoin de relations de configuration manuellement (voir Add One-to-Many Entities):

var customer = new Customer(); 
customer.Orders.Add(new Order()); 
context.Customers.Add(customer); 
context.SaveChanges(); 

Lorsque vous appelez entité client Customers.Add sera ajouté au contexte et mis en Added état. La même chose se produira avec toutes ses entités liées (ordres) - elles auront l'état Added. Tout le graphique sera inséré à la base de données sur l'appel SaveChanges. Gardez à l'esprit que cette astuce ne fonctionnera pas pour la mise à jour du graphique.

BTW: L'article MSDN Defining and Managing Relationships mérite d'être lu.


MISE À JOUR: Voici ce qui se passe lorsque vous travaillez avec EF:

var customer = new Customer(); 
var order = new Order(); 
customer.Orders.Add(order); // order.Customer is null 

À ce stade EF complètement non impliqué. Vous pouvez définir manuellement le client de l'objet de la commande. Habituellement, je gère les associations bidirectionnelles dans la méthode Add ou Remove. C'est à dire. ajouter un ordre à la collection de commandes et définir le propriétaire sur this. C'est à vous de décider à ce stade. Par défaut, le propriétaire de la commande sera null. Suivant:

context.Customers.Add(customer); // order.Customer is customer, but no ids 

Voici EF. Rien n'est conservé dans la base de données. MAIS EF assez intelligent pour savoir que l'ordre concerne le client, et il définira la référence du client (propriétaire) à ce client particulier. Ce n'est plus null. Mais, donc rien n'est persistant, les objets n'ont pas encore d'ID.

context.SaveChanges(); // ids updated 

Voila. Maintenant, EF a inséré des objets dans la base de données. Il a reçu des ID et des objets mis à jour avec des ID corrects.

+0

Dans votre exemple, serais-je capable de traverser Order.Customer * avant que le client soit passé au contexte? Rappelez-vous, je vais manipuler/traverser ces hiérarchies d'entités avant qu'elles ne soient jamais persistées à la base de données. Je ne pensais pas que les entités POCO avaient une logique intégrée pour mettre en place une relation «bidirectionnelle», c'est-à-dire simplement faire 'customer.Orders.Add (order)' ne peuplera pas les commandes '.Customer' et'. Propriétés CustomerId', le sera-t-il? –

+0

@AndrewStephens voir la mise à jour de la réponse.J'ai ajouté une description étape par étape de ce qui se passe. –

Questions connexes