2010-12-30 3 views
6

J'utilise Entity Framework CTP5 (-premier code) et j'ai deux classes:Entity Framework CTP5, code d'abord. Propriété de navigation en option

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

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

et

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

et moi avons la classe de configuration suivante pour 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); 

     } 
    } 

Actuellement, si vous créez une instance 'OrderLine', vous devez spécifier une instance 'Order'.

La question: comment puis-je rendre la propriété ol.Order optionnelle (null dans certains cas)? C'est possible?

Répondre

6

La raison commande est maintenant nécessaire sur OrderLine est parce que vous avez utilisé dans votre HasRequired() code API fluide pour configurer l'association. Nous avons simplement besoin de changer cela pour HasOptional comme le code suivant indique:

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

Ce sera essentiellement faire la colonne OrderLines.OrderId comme (INT, NULL) dans la base de données afin que les dossiers OrderLine seront indépendants. Nous devons aussi tenir compte de ce changement dans le modèle d'objet par marque OrderId annulable sur la 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; } 
} 

Maintenant, vous pouvez enregistrer OrderLines sans spécifier un ordre pour eux.

+0

Morteza, merci. Ça fonctionne bien –

2

Je ne sais pas pourquoi vous voulez faire ... mais vous pouvez simplement changer

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

à

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

Mais dans ce cas, la propriété de navigation (ol.Order) ne fonctionnera pas. Il ne sera pas charger l'ordre approprié (chargement paresseux). –

+0

La propriété Order est facultative ou non. Si c'est optionnel, alors il peut être null dans la base de données. C'est exactement pourquoi j'ai commencé ma réponse avec: "Je ne sais pas pourquoi tu veux faire ça". Que voulez-vous exactement accomplir? –

Questions connexes