Alors que j'étudiais la différence entre Include
et Join
, j'ai trouvé que:
Si la base de données n'inclut pas inclut une clé étrangère -il n'a pas d'accessoires de navigation, il est donc préférable d'utiliser Join
Si It fait ont des accessoires de navigation - alors utilisez Include
. (il enregistre également un coup de DB.)
Mais une réponse ici a attiré mon attention:
Inclure est implémenté en tant que jointure. En fonction de la nullité du lien inclus, il s'agit d'un interne ou jointure gauche .
Question:
Comment la nullité affecte-t-elle la jointure gauche/interne?
Dans le serveur SQL, je peux avoir une table Cities
et une table Persons
et une personne peut avoir une NULL
CityID
.
Pourquoi Entity Framework décide-t-il pour moi de quel type de jointure il s'agit?
Maintenant, changeons CityId en non null:
Et voici le changement:
Supposons que dans votre classe il y ait un [Required]
contrainte sur City ou CityID. Et supposons qu'il existe des enregistrements Personne sans ville (valide). La seule façon de satisfaire le [Required]
consiste à effectuer une jointure interne.
Mais tant que les contraintes de votre Db et de votre modèle correspondent (c'est-à-dire CityID INT NOT NULL
) peu importe le type de jointure utilisé. Cela devrait être le cas normal.
Et sans la contrainte, vous vous attendriez bien sûr à une jointure gauche.
Je sais que c'est une vieille question, mais si quelqu'un d'autre atterrit ici en utilisant EF Code First comme je suis, mon problème était dans les mappages fluides:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Parent>()
.HasOptional(a => a.Child) /* LEFT OUTER JOIN */
.WithMany()
.HasForeignKey(a => a.ChildId);
}
se traduit par LEFT OUTER JOIN alors que
modelBuilder.Entity<Parent>()
.HasRequired(a => a.Child) /* INNER JOIN */
.WithMany()
.HasForeignKey(a => a.ChildId);
se traduit par INNER JOIN.