2010-12-13 33 views
12

Avec le code EF4 (en utilisant CTP5), je peux ajouter une seule propriété de navigation avec la clé étrangère et respecter la dénomination et ajouter uniquement la clé étrangère à la table une seule fois. Si je vais ensuite ajouter une seconde propriété du même type, elle se décompose en 4 colonnes sur la table au lieu de deux.Comment puis-je configurer deux propriétés de navigation du même type dans Entity Framework

Exemple de code:

Avec ce modèle, je reçois une propriété unique ajoutée à la table de AdapterFrameCapability pour presstype nommé PressTypeID.

public class AdapterFrameCapability 
{ 
    [Key] 
    public int AdapterFrameCapabilityID { get; set; } 

    [Required] 
    public int PressTypeID { get; set; } 

    public virtual PressType PressType { get; set; } 
} 

C'est la configuration que je veux modéliser, mais il se traduit par 4 colonnes créées dans le tableau, un pour chaque FromPressTypeID, FromPressTypeFromPressTypeID, ToPressTypeID et ToPressTypePressTypeID. Idéalement, je voudrais juste une colonne pour FromPressTypeID et ToPressTypeID. Qu'est-ce que je fais mal ici?

public class AdapterFrameCapability 
{ 
    [Key] 
    public int AdapterFrameCapabilityID { get; set; } 

    [Required] 
    public int FromPressTypeID { get; set; } 

    [Display(Name = "From Press Type")] 
    public virtual PressType FromPressType { get; set; } 

    [Required] 
    public int ToPressTypeID { get; set; } 

    [Display(Name = "To Press Type")] 
    public virtual PressType ToPressType { get; set; } 
} 

Répondre

14

Il est l'un de ces scénarios que vous devez descendre fluent API pour obtenir le schéma souhaité:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<AdapterFrameCapability>() 
       .HasRequired(afc => afc.FromPressType) 
       .WithMany() 
       .HasForeignKey(afc => afc.FromPressTypeID) 
       .WillCascadeOnDelete(true); 

    modelBuilder.Entity<AdapterFrameCapability>() 
       .HasRequired(afc => afc.ToPressType) 
       .WithMany() 
       .HasForeignKey(afc => afc.ToPressTypeID) 
       .WillCascadeOnDelete(false); 
} 

Commutation suppression en cascade au large sur l'une des associations est intentionnelle, car autrement SQL Server serait jeter l'erreur suivante:

Introducing FOREIGN KEY constraint 'AdapterFrameCapability_ToPressType' on table 'AdapterFrameCapabilities' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint.

Nous devons donc désactiver l'une des associations comme je l'ai fait dans le code.

0

Je pensais que vous supposez d'utiliser l'attribut d'annotation de données

[ForeignKey("FromPressTypeId")] 

etc.