2017-10-04 79 views
1

提前感谢您的帮助。 我对使用include()方法实体框架6时发生的情况有些困惑。 据我所知,包含对象为NULL时的包含方法为LEFT JOIN,当对象匹配时为OUTER JOINInclude()不能用作LEFT JOIN(实体框架6)

我会通过发生在我身上的例子,以便您了解发生的事情。

我有以下型号我的表:

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; } 
} 

下面是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"); 

    } 
} 

的情况说不清楚发生在使用下面的代码块:

var db = new BookingContext(); 

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

我倾向于因为在结果记录没有来其SourceBookingNULL,在这种情况下将制作LEFT JOIN

有人可以向我解释这一点,并给我一个可能的解决方案,这种情况?

谢谢。

+0

在预订类,你应该把'[ForeignKey的(“SourceBookingId”)上面的'SourceBooking财产 – OrcusZ

+0

好了,但它确实没有解决我的问题。 –

+0

我怎样才能使用Fluent API建立同样的关系? –

回答

3

EF产生LEFT OUTER JOIN可选关系和INNER JOIN为所需关系。

通过在此处使用非可空int

public int SourceBookingId { get; set; } 

你告诉EF,我们的关系需要,即列值不能NULL而且必须始终匹配的记录中SourceBooking表。因此它会生成INNER JOIN

如果不是这种情况,只需更改FK属性类型可空

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

对我有意义,我会测试 –

+0

谢谢。这个概念对我来说很清楚,而且它也很完美。 –