Alternatives aux conventions de dénomination des propriétés de navigation de clé étrangère

Lorsque vous utilisez Entity Framework 4.1, existe-t-il des alternatives aux conventions de dénomination pour les propriétés de navigation?

Par exemple au lieu de faire ceci:

public virtual MyObject MyObject { get; set; } 

Être

 public virtual MyObject SomeOtherName { get; set; } 

METTRE À JOUR:

Lorsque les [ForeignKey("OldStepId")] et [ForeignKey("NewStepId")] sont ajoutés, le [ForeignKey("NewStepId")] SQL généré devient alors:

 {SELECT `Extent1`.`CompletedId`, `Extent1`.`OldStepId`, `Extent1`.`NewStepId`, `Extent1`.`Name`, `Extent1`.`Step_StepId`, `Extent1`.`Step_StepId1` FROM `Completed` AS `Extent1`} 

qui, les deux dernières colonnes n’existent pas.

Pour ce faire, vous pouvez utiliser les annotations de données ou l’API Fluent.

Manière atsortingbut

 public virtual Int32 MyObjectId{get;set;} [ForeignKey("MyObjectId")] public virtual MyObject SomeOtherName { get; set; } 

Manière Courante

 modelBuilder.Entity() .HasRequired(p => p.SomeOtherName) .WithMany(d => d.Type) .HasForeignKey(p => p.MyObjectId) 

RÉPONSE À LA MISE À JOUR

Si vous avez une liste dans votre classe MyOjbect, vous devez alors marquer cette liste comme [InverseProperty("SomeOtherName")] . C’est peut-être pour cela que vous obtenez des colonnes supplémentaires dans votre code SQL. Cela empêche les relations bidirectionnelles d’être doublées en indiquant au générateur l’emplacement réel de la colonne principale.

Je les appelle généralement le même nom que la clé étrangère pour les accessoires de navigation.

Si vous ajoutez un modèle T4 pour générer le contenu, vous pouvez ajuster le schéma de nommage à votre guise …

Vous pouvez les nommer comme vous le souhaitez. Vous devez faire la distinction entre les propriétés de navigation ayant une propriété de clé étrangère (scalaire) exposée dans la classe (“associations de clés étrangères”) et les propriétés de navigation n’ayant pas (“associations indépendantes”):

Associations de clés étrangères :

 [ForeignKey("VeryDifferentFKPropertyName")] // refers to property, NOT column public virtual MyObject SomeOtherName { get; set; } [Column("JustAnotherColumnName")] // map property to column name public int VeryDifferentFKPropertyName { get; set; } 

Avec l’API Fluent:

 modelBuilder.Entity() .HasRequired(e => e.SomeOtherName) // or .HasOptional(...) .WithMany() .HasForeignKey(e => e.VeryDifferentFKPropertyName); modelBuilder.Entity() .Property(e => e.VeryDifferentFKPropertyName) .HasColumnName("JustAnotherColumnName"); 

Associations indépendantes :

 public virtual MyObject SomeOtherName { get; set; } 

Vous pouvez mapper le nom de colonne de clé étrangère uniquement avec l’API Fluent:

 modelBuilder.Entity() .HasRequired(e => e.SomeOtherName) // or .HasOptional(...) .WithMany() .Map(a => a.MapKey("JustAnotherColumnName"));