2010-12-30 27 views
6

Sto utilizzando Entity Framework CTP5 (codice-prima) e ho due classi:Entity Framework CTP5, codice prima. proprietà di navigazione opzionale

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

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

e

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

e ho la seguente classe di configurazione per la classe 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); 

     } 
    } 

Attualmente se si crea un'istanza "OrdineLine", è necessario specificare un'istanza "Ordine".

La domanda: come posso rendere facoltativa la proprietà ol.Order (null in alcuni casi)? È possibile?

risposta

6

Il motivo Ordine è ora richiesto OrderLine è perché si è utilizzato nella vostra HasRequired() codice API fluente per configurare l'associazione. Abbiamo semplicemente bisogno di cambiare la situazione a HasOptional come nel codice seguente:

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

Questo sarà essenzialmente la colonna OrderLines.OrderId come (INT, NULL) nel DB in modo che i record OrderLine saranno indipendenti. Dobbiamo anche riflettere questo cambiamento nel modello a oggetti da make OrderId annullabile sulla classe 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; } 
} 

Ora, è possibile salvare OrderLines senza specificare un ordine per loro.

+0

Morteza, grazie. Funziona bene –

2

Non certo perché si vuole fare ... ma si può solo cambiare

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

a

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

Ma in questo caso la proprietà di navigazione (ol.Order) non funzionerà. Non verrà caricato l'ordine appropriato (caricamento lento). –

+0

La proprietà Order è facoltativa o meno. Se è facoltativo, può essere nullo nel database. Questo è esattamente il motivo per cui ho iniziato la mia risposta con: "Non so perché lo vuoi fare". Cosa vuoi esattamente raggiungere? –

Problemi correlati