Question

Avec le code premier EF4 (en utilisant CTP5) Je peux ajouter une seule propriété de navigation ainsi que la clé étrangère et respecterai la dénomination et ajouter que la clé étrangère à la table une seule fois. Si je puis aller et ajouter une deuxième propriété du même type, il se décompose en 4 colonnes sur la table au lieu de deux.

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

Ceci est la configuration que je veux modèle, mais il en résulte 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; }
}
Était-ce utile?

La solution

Il est un de ces scénarios que vous devez descendre API couramment 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 de suppression en cascade de rabais sur l'une des associations est volontaire parce que sinon SQL Server jetteraient l'erreur suivante:

  

Présentation de la contrainte FOREIGN KEY 'AdapterFrameCapability_ToPressType' sur la table 'AdapterFrameCapabilities' peut provoquer des cycles ou plusieurs chemins en cascade. Spécifiez DELETE NO ACTION ou ON UPDATE NO ACTION, ou modifier d'autres contraintes FOREIGN KEY.   Impossible de créer la contrainte.   

Nous avons donc besoin de l'éteindre sur l'une des associations comme la façon dont je l'ai fait dans le code.

Autres conseils

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

[ForeignKey("FromPressTypeId")]

etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top