2010-12-30 27 views
6

estoy usando Entity Framework CTP5 (código primero) y tengo dos clases:Entity Framework CTP5, primer código. propiedad de navegación opcional

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

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

y

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

y tengo la siguiente clase de configuración para la clase 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); 

     } 
    } 

Actualmente, si crea una instancia 'OrderLine', debe especificar una instancia 'Order'.

La pregunta: ¿cómo puedo hacer que la propiedad ol.Order sea opcional (nula en algunos casos)? ¿Es posible?

Respuesta

6

La razón por la que se requiere ahora en la Orden OrderLine se debe a que utilizó en su HasRequired() código API fluido para configurar la asociación. Simplemente tenemos que cambiar eso a HasOptional como en el código siguiente:

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

Esto se hacen básicamente la columna de la OrderLines.OrderId como (INT, NULL) en la base de datos de manera que los registros OrderLine serán independientes. Tenemos que reflexionar también este cambio en el modelo de objetos por marca OrderId anulable en clase OrderLine:

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

    public virtual Order Order { get; set; } 
} 

Ahora, puede guardar OrderLines sin especificar una orden para ellos.

+0

Morteza, gracias. Funciona bien –

2

No estoy seguro de por qué quiere hacer eso ... pero se puede cambiar simplemente

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

a

this.HasOptional(ol => ol.Order); 
+0

Pero en este caso la propiedad de navegación (ol.Order) no funcionará. No se cargará el orden apropiado (carga diferida). –

+0

La propiedad de pedido es opcional o no. Si es opcional, puede ser nulo en la base de datos. Esta es exactamente la razón por la que comencé mi respuesta con: "No estoy seguro de por qué quieres hacer eso". ¿Qué es exactamente lo que quieres lograr? –

Cuestiones relacionadas