asp.net – 实体框架CTP5,代码优先.可选的导航属性

前端之家收集整理的这篇文章主要介绍了asp.net – 实体框架CTP5,代码优先.可选的导航属性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Entity Framework CTP5(代码优先),我有两个类:
  1. public class Order
  2. {
  3. public int Id {get;set;}
  4. public decimal SomeOtherProperty1 {get;set;}
  5.  
  6. //navigation property
  7. public virtual ICollection<OrderLine> OrderLines { get; set; }
  8. }

  1. public class OrderLine
  2. {
  3. public int Id {get;set;}
  4. public int OrderId {get;set;}
  5. public decimal SomeOtherProperty2 {get;set;}
  6.  
  7. //navigation property
  8. public virtual Order Order { get; set; }
  9. }

我有OrderLine类的以下配置类:

  1. public partial class OrderLineMap : EntityTypeConfiguration<OrderLine>
  2. {
  3. public OrderLineMap()
  4. {
  5. this.HasKey(ol=> ol.Id);
  6.  
  7. this.Hasrequired(ol=> ol.Order)
  8. .WithMany(o => o.OrderLines)
  9. .HasForeignKey(ol=> ol.OrderId);
  10.  
  11. }
  12. }

目前,如果您创建“OrderLine”实例,则必须指定“订单”实例.

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

解决方法

OrderLine上现在需要Order的原因是因为您在流畅的API代码中使用了Hasrequired()来配置关联.我们只需将其更改为HasOptional,如下面的代码所示:
  1. this.HasOptional(ol => ol.Order)
  2. .WithMany(o => o.OrderLines)
  3. .HasForeignKey(ol => ol.OrderId);

这将基本上使OrderLines.OrderId列成为DB中的(INT,NULL),以便OrderLine记录是独立的.我们还需要通过在OrderLine类上使OrderId为空来反映对象模型中的这种变化:

  1. public class OrderLine
  2. {
  3. public int Id { get; set; }
  4. public int? OrderId { get; set; }
  5. public decimal SomeOtherProperty2 { get; set; }
  6.  
  7. public virtual Order Order { get; set; }
  8. }

现在,您可以保存OrderLines而无需为它们指定订单.

猜你在找的asp.Net相关文章