Comment puis-je mettre en place deux propriétés de navigation du même type dans Entity Framework
-
09-10-2019 - |
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; }
}
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.