¿Por qué la unión externa izquierda?

extraño. (Probablemente no raro, en absoluto)

Tengo 3 objects, Empleado, Rota y Departamento.

public class Employee { public int Id { get; set; } public String Name { get; set; } public virtual Department Department { get; set; } } internal class EmployeeMapping : EntityTypeConfiguration<Employee> { public EmployeeMapping() { HasKey(a => a.Id); Property(a => a.Id).HasColumnName("UserId"); HasRequinetworking<Department>(a => a.Department).WithOptional().Map(a => a.MapKey("DepartmentId")); } } public class Department { public int Id { get; set; } public String Name { get; set; } } internal class DepartmentMapping : EntityTypeConfiguration<Department> { public DepartmentMapping() { HasKey(a => a.Id); Property(a => a.Id).HasColumnName("DepartmentId"); } } public class Rota { public int Id { get; set; } public virtual Employee Employee { get; set; } public virtual Department Department { get; set; } } internal class RotaMapping : EntityTypeConfiguration<Rota> { public RotaMapping() { HasKey(a => a.Id); Property(a => a.Id).HasColumnName("RotaId"); HasOptional<Employee>(a => a.Employee).WithOptionalDependent().Map(a => a.MapKey("EmployeeId")); HasOptional<Department>(a => a.Department).WithOptionalDependent().Map(a => a.MapKey("DepartmentId")); } } 

No es complicado, en absoluto realmente. Rota puede tener un empleado y / o un departamento asignado, todo esto se configura con Fluent. Todas mis asociaciones son correctas (el esquema es perfecto), sin embargo, tengo una rara rareza.

Cuando hago un myContext.Departments.FirstOrDefault() y eche un vistazo al SQL Generated, hay un IZQUIERDO OUTER JOIN en Employee & Rota. ¿Por qué está esto allí?
No quiero que haga esto. Tal vez mis asignaciones Fluent son incorrectas? He intentado todo tipo de cosas, pero no puedo entenderlo. Lo entendería si quisiera un object Rota, que se uniera al Departamento. ¡Pero no al revés!

Si hago myContext.Departments.AsNoTracking().FirstOrDefault() no hace el LEFT OUTER JOIN .

Alguna idea chicos?

Saludos, D

El motivo es el mapeo incorrecto. Se ve correcto, pero no lo es. Use estos en su lugar:

 internal class EmployeeMapping : EntityTypeConfiguration<Employee> { public EmployeeMapping() { HasKey(a => a.Id); Property(a => a.Id).HasColumnName("UserId"); HasRequinetworking<Department>(a => a.Department).WithMany() .Map(a => a.MapKey("DepartmentId")); } } internal class RotaMapping : EntityTypeConfiguration<Rota> { public RotaMapping() { HasKey(a => a.Id); Property(a => a.Id).HasColumnName("RotaId"); HasOptional<Employee>(a => a.Employee).WithMany() .Map(a => a.MapKey("EmployeeId")); HasOptional<Department>(a => a.Department).WithMany() .Map(a => a.MapKey("DepartmentId")); } } 

Su asignación se interpreta correctamente al crear una database y database correctos, pero EF considera que correlaciona todas las relaciones como uno a uno. Eso confunde a EF y generará consultas utilizadas de forma personalizada para crear references de entidades internas. Estas uniones a la izquierda son necesarias para la relación uno a uno cuando le dices a EF que las entidades dependientes son opcionales. EF no sabe si existen a less que cargue sus keys.

De ninguna manera soy un experto y solo estoy adivinando aquí. Pero podría intentar la consulta de la forma en que la entidad marco lo está haciendo y luego probarla de la manera en que lo ideal sería ver la consulta y publicar las diferencias de time. Tal vez el marco de la entidad está en algo aquí, pero lo dudo.

Tengo teoría. La combinación externa izquierda desaparece cuando desactiva el seguimiento de cambios. También Employee y Rota tienen references al Departamento.

Así que mi teoría es que con el seguimiento de cambios en Entity Framework se intenta cargar todas las entidades con una reference al departamento en caso de que tenga que poner en cascada una actualización en el departamento.

En otras palabras, cree que un cambio en un departamento podría causar un cambio en el empleado o Rota que hace reference al departamento, por lo que todo se carga por si acaso.