c# - licence - Entity framework Incluir comando-¿Unión izquierda o interior?
linqpad licence (2)
Sé que esta es una pregunta antigua, pero si alguien más aterriza aquí utilizando el Código EF Primero como soy, mi problema fue en las asignaciones fluidas:
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 traduce como IZQUIERDA EXTERNA IZQUIERDA mientras que
modelBuilder.Entity<Parent>()
.HasRequired(a => a.Child) /* INNER JOIN */
.WithMany()
.HasForeignKey(a => a.ChildId);
Se traduce como UNIÓN INTERNA .
Mientras investigaba la diferencia entre Include
y Join
, encontré que:
Si la base de datos no incluye una clave externa, no tiene propiedades de navegación, por lo que es mejor usar Join
Si tiene accesorios de navegación, entonces use Include
. (También guarda un hit db.)
Pero una respuesta aquí llamó mi atención:
Incluir se implementa como una unión. Dependiendo de la nulabilidad del enlace incluido, es una unión interna o izquierda .
Pregunta:
¿Cómo afecta la nulidad a la unión izquierda / interior?
En el servidor Sql puedo tener una tabla de Cities
y una tabla de Persons
y una persona puede tener un CityID
NULL
.
¿ Por qué entidad Framework decide por mí qué tipo de unión es?
edición: visualización:
Ahora cambiemos CityId a no null:
Y aquí está el cambio:
Supongamos que en su clase hay una restricción [Required]
en City o CityID. Y supongamos que hay registros Personales sin una Ciudad (válida). La única forma de satisfacer el [Required]
es realizar una unión interna.
Pero siempre que las restricciones en su Db y modelo coincidan (es decir, CityID INT NOT NULL
) no importará realmente qué tipo de Join se use. Ese debería ser el caso normal.
Y sin la restricción, por supuesto, usted esperaría una unión izquierda.