Entity Framework CTP5, code-first. Optional naviga

2020-07-10 08:39发布

I'm using Entity Framework CTP5 (code-first) and I have two classes:

public class Order
{
   public int Id {get;set;}
   public decimal SomeOtherProperty1 {get;set;}

   //navigation property
   public virtual ICollection<OrderLine> OrderLines { get; set; }  
}

and

public class OrderLine
{
   public int Id {get;set;}
   public int OrderId {get;set;}
   public decimal SomeOtherProperty2 {get;set;}

   //navigation property
   public virtual Order Order { get; set; }
}

And I have the following configuration class for OrderLine class:

public partial class OrderLineMap : EntityTypeConfiguration<OrderLine>
    {
        public OrderLineMap()
        {
            this.HasKey(ol=> ol.Id);

            this.HasRequired(ol=> ol.Order)
                .WithMany(o => o.OrderLines)
                .HasForeignKey(ol=> ol.OrderId);

        }
    }

Currently if you create an 'OrderLine' instance, you have to specify an 'Order' instance.

The question: how can I make ol.Order property optional (null in some cases)? Is it possible?

2条回答
Lonely孤独者°
2楼-- · 2020-07-10 09:10

The reason Order is now required on OrderLine is because you used HasRequired() in your fluent API code to configure the association. We simply need to change that to HasOptional as the following code shows:

this.HasOptional(ol => ol.Order)
    .WithMany(o => o.OrderLines)
    .HasForeignKey(ol => ol.OrderId);

This will basically make the OrderLines.OrderId column as (INT, NULL) in the DB so that OrderLine records will be independent. We need to also reflect this change in the object model by make OrderId nullable on OrderLine class:

public class OrderLine
{
    public int Id { get; set; }
    public int? OrderId { get; set; }
    public decimal SomeOtherProperty2 { get; set; }

    public virtual Order Order { get; set; }
}

Now, you can save OrderLines without specifying an Order for them.

查看更多
ゆ 、 Hurt°
3楼-- · 2020-07-10 09:10

Not sure why you want to do that... but you can just change

 this.HasRequired(ol=> ol.Order)
      .WithMany(o => o.OrderLines)
      .HasForeignKey(ol=> ol.OrderId);

to

 this.HasOptional(ol => ol.Order);
查看更多
登录 后发表回答