J'ai un débat mental avec moi-même chaque fois que je commence à travailler sur un nouveau projet et que je conçois mes POCO. J'ai vu de nombreux tutoriels / exemples de code qui semblent favoriser les associations de clés étrangères :
Association de clé étrangère
public class Order
{
public int ID { get; set; }
public int CustomerID { get; set; } // <-- Customer ID
...
}
Contrairement aux associations indépendantes :
Association indépendante
public class Order
{
public int ID { get; set; }
public Customer Customer { get; set; } // <-- Customer object
...
}
J'ai travaillé avec NHibernate dans le passé et utilisé des associations indépendantes, qui non seulement se sentent plus OO, mais aussi (avec chargement paresseux) ont l'avantage de me donner accès à l'ensemble de l'objet Customer, au lieu de juste son ID. Cela me permet, par exemple, de récupérer une instance Order, puis de ne Order.Customer.FirstName
pas avoir à faire une jointure explicitement, ce qui est extrêmement pratique.
Donc, pour récapituler, mes questions sont:
- Le recours à des associations indépendantes présente-t-il des inconvénients importants? et...
- S'il n'y en a pas, quelle serait la raison d'utiliser des associations de clés étrangères?
la source
Utilise les deux. Et rendez vos références d'entité virtuelles pour permettre un chargement paresseux. Comme ça:
Cela évite les recherches inutiles dans la base de données, permet un chargement paresseux et vous permet de voir / définir facilement l'ID si vous savez ce que vous voulez qu'il soit. Notez que les deux ne modifient en aucun cas la structure de votre table.
la source
L'association indépendante ne fonctionne pas bien avec ce
AddOrUpdate
qui est généralement utilisé dans laSeed
méthode. Lorsque la référence est un élément existant, elle sera réinsérée.Le résultat est que le client existant sera réinséré et un nouveau client (réinséré) sera associé à une nouvelle commande.
Sauf si nous utilisons l'association de clé étrangère et attribuons l'id.
Nous avons le comportement attendu, le client existant sera associé à une nouvelle commande.
la source
var order = new Order { Id = 1, Customer = db.Customers.Find(1) };
ou vous pouvez utiliser la méthode Select pour charger le client à partir du contexte db. Cela fonctionne avec une association indépendante.Je privilégie l'approche objet pour éviter les recherches inutiles. Les objets de propriété peuvent être tout aussi facilement remplis lorsque vous appelez votre méthode de fabrique pour construire l'entité entière (en utilisant un simple code de rappel pour les entités imbriquées). Il n'y a pas d'inconvénients que je peux voir à l'exception de l'utilisation de la mémoire (mais vous mettriez en cache vos objets, n'est-ce pas?). Donc, tout ce que vous faites est de remplacer la pile par le tas et de gagner en performances en n'effectuant pas de recherches. J'espère que cela a du sens.
la source