2017-10-04 3 views
1

Merci d'avance pour votre aide. Je suis un peu confus au sujet d'une situation qui m'est apparue lors de l'utilisation de la méthode include()Entity Framework 6. Si je comprends bien, la méthode include fonctionne comme LEFT JOIN lorsque l'objet ci-joint est NULL et OUTER JOIN lorsque l'objet correspond.Include() ne fonctionne pas en tant que LEFT JOIN (Entity Framework 6)

Je vais passer l'exemple qui m'est apparu, afin que vous m'aidiez à comprendre ce qui s'est passé.

Je les modèles suivants à mes tableaux:

public class Booking 
    { 
     [Key] 
     public int ID{ get; set; } 

     public string Description{ get; set; } 

     public decimal Amount{ get; set; } 

     public decimal AmoutPaid{ get; set; } 

     public DateTime? Checkin { get; set; } 

     public DateTime? Checkout { get; set; } 

     [ForeignKey("SourceBooking ")] 
     public int SourceBookingId { get; set; } 

     public SourceBooking SourceBooking { get; set; } 
    } 





public class SourceBooking 
{ 
    [Key] 
    public int ID{ get; set; } 

    public string Name{ get; set; } 

    public decimal CommissionFee{ get; set; } 
} 

est inférieure à la DbContext:

public class BookingContext:DbContext 
{ 
    public BookingContext():base("bookingConnection") 
    { 
    } 

    public DbSet<Booking> Bookings{ get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<SourceBooking>().ToTable("sourcebookings", "public"); 

     modelBuilder.Entity<Booking>().ToTable("bookings", "public"); 

    } 
} 

La situation qui ne sait pas a eu lieu dans l'utilisation du bloc de code suivant:

var db = new BookingContext(); 

var bookings = db.Bookings.Include (b => b.SourceBooking); 

J'ai tendu parce que dans les résultats les enregistrements ne sont pas venus dont SourceBooking est NULL, auquel cas un LEFT JOIN serait fait.

Est-ce que quelqu'un pourrait m'expliquer cela et me donner une solution possible à cette situation?

Merci.

+0

dans votre classe de réservation, vous devez mettre '[ForeignKey ("SourceBookingId")]' ci-dessus propriété SourceBooking – OrcusZ

+0

D'accord, mais il l'a fait pas résoudre mon problème. –

+0

comment puis-je faire cette même relation en utilisant l'API Fluent? –

Répondre

3

EF génère LEFT OUTER JOIN pour en option relations et INNER JOIN pour nécessaires relations.

En utilisant le type non annulable int ici

public int SourceBookingId { get; set; } 

vous dites EF que la relation est nécessaire, à savoir la valeur de la colonne ne peut pas être NULL et il doit y avoir toujours un enregistrement correspondant dans le tableau SourceBooking. Par conséquent, il génère INNER JOIN.

si ce n'est pas le cas, il suffit de changer le type de propriété FK à nullable

public int? SourceBookingId { get; set; } 
+0

a un sens pour moi, je vais tester –

+0

Merci. Le concept était plus clair pour moi, et cela fonctionnait parfaitement aussi. –