Asp.net 实体框架CTP5,代码优先。可选导航属性

Asp.net 实体框架CTP5,代码优先。可选导航属性,asp.net,entity-framework,code-first,Asp.net,Entity Framework,Code First,我使用的是实体框架CTP5(代码优先),我有两个类: public class Order { public int Id {get;set;} public decimal SomeOtherProperty1 {get;set;} //navigation property public virtual ICollection<OrderLine> OrderLines { get; set; } } 我有以下OrderLine类的配置类: pub

我使用的是实体框架CTP5(代码优先),我有两个类:

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

   //navigation property
   public virtual ICollection<OrderLine> OrderLines { get; set; }  
}
我有以下OrderLine类的配置类:

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

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

    public virtual Order Order { get; set; }
}
公共部分类OrderLineMap:EntityTypeConfiguration { 公共OrderLineMap() { this.HasKey(ol=>ol.Id); this.HasRequired(ol=>ol.Order) .有许多(o=>o.订单行) .HasForeignKey(ol=>ol.OrderId); } } 当前,如果创建“订单行”实例,则必须指定“订单”实例


问题:如何使ol.Order属性成为可选的(在某些情况下为null)?可能吗

不知道你为什么要这么做。。。但你可以改变

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


现在在OrderLine上需要订单的原因是,您在fluent API代码中使用了
HasRequired()
来配置关联。我们只需将其更改为
haseoptional
,如下代码所示:

this.HasOptional(ol => ol.Order)
    .WithMany(o => o.OrderLines)
    .HasForeignKey(ol => ol.OrderId);
这将基本上使数据库中的OrderLines.OrderId列成为(INT,NULL),以便OrderLine记录是独立的。我们还需要通过在OrderLine类上使
OrderId
nullable来反映对象模型中的这一变化:

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

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

    public virtual Order Order { get; set; }
}

现在,您可以在不指定订单的情况下保存订单行。

但在这种情况下,导航属性(ol.Order)将不起作用。将不会加载适当的顺序(延迟加载)。order属性是可选的或非可选的。如果它是可选的,那么它在数据库中可以为null。这正是我开始回答的原因:“不知道你为什么要这么做”。你到底想要实现什么?