asp.net - Entity Framework CTP5,代码优先。可选导航属性

标签 asp.net entity-framework code-first

我正在使用 Entity Framework CTP5(代码优先)并且我有两个类:

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

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


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

我有以下 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);

        }
    }

目前,如果您创建一个 'OrderLine' 实例,您必须指定一个 'Order' 实例。

问题:如何使 ol.Order 属性可选(在某些情况下为 null)?是否可以?

最佳答案

OrderLine 现在需要 Order 的原因是因为您使用了 HasRequired()在您流畅的 API 代码中配置关联。我们只需要将其更改为 HasOptional如以下代码所示:

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

这将基本上使 OrderLines.OrderId 列在数据库中为 (INT, NULL),以便 OrderLine 记录独立。我们还需要通过 make OrderId 在对象模型中反射(reflect)这种变化。在 OrderLine 类上可为 null:
public class OrderLine
{
    public int Id { get; set; }
    public int? OrderId { get; set; }
    public decimal SomeOtherProperty2 { get; set; }

    public virtual Order Order { get; set; }
}

现在,您可以保存 OrderLine 而无需为其指定 Order。

关于asp.net - Entity Framework CTP5,代码优先。可选导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4561079/

相关文章:

c# - Asp.net MVC 如何从 Controller 打开新窗口

c# - 如何在ListView/GridView中显示DataSet

c# - .NET Core Entity Framework 如何从模型创建表

asp.net-mvc - ASP.NET MVC3 和 Entity Framework 代码优先架构

entity-framework - EF 代码优先 : IValidatable Object not validating

c# - 为每个页面使用不同的 DbContext 类的好习惯?

c# - ASP.NET MVC。如何禁用基于参数的必需验证?

asp.net - 在CSS中对齐Div

asp.net - 在 async/await 之前的过去,WebAPI 请求是如何取消的?

c# - 属性id是对象关键信息的一部分,不可修改