web-dev-qa-db-fra.com

Structure d'entité Commande Inclure - Jointure gauche ou interne?

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 NULLCityID.

Pourquoi Entity Framework décide-t-il pour moi de quel type de jointure il s'agit?

edit: visualisation:

enter image description here

enter image description here

Maintenant, changeons CityId en non null:

enter image description here

Et voici le changement:

enter image description here

27
Royi Namir

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.

13
Henk Holterman

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.

5
madannes