web-dev-qa-db-fra.com

Mappage d'une clé étrangère avec un nom de colonne personnalisé

J'utilise Entity Framework 4.3 en premier avec Oracle. J'obtiens l'erreur suivante:

System.InvalidOperationException: le ForeignKeyAttribute sur la propriété "WidgetSequence" sur le type "WidgetDistributor.WidgetEntity" n'est pas valide. Le nom de clé étrangère "WIDGETSEQUENCE_ID" est introuvable sur le type dépendant "WidgetDistributor.WidgetEntity". La valeur Name doit être une liste séparée par des virgules de noms de propriété de clé étrangère.

Mes entités sont comme ça:

[Table("WIDGETENTITIES")]
public class WidgetEntity {

    [Column("WIDGETENTITY_ID")]
    public int Id { get; set; }

    [ForeignKey("WIDGETSEQUENCE_ID")]
    public WidgetSequence Sequence { get; set; }

    // and other properties that map correctly
}

[Table("WIDGETSEQUENCES")]
public class WidgetSequence { 

    [Column("WIDGETSEQUENCE_ID")]
    public int Id { get; set; }

    [Column("NUMBER")]
    public int Number { get; set; }
}

Mon code semble correct. Qu'est-ce que j'ai fait de mal ici?

40
Byron Sommardahl

ForeignKey attibute attend un nom de propriété dans votre classe comme argument mais vous avez donné le nom de la colonne. Utilisez des cartographies fluides.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<WidgetEntity>()
     .HasRequired(w => w.Sequence)
     .WithMany()
     .Map(m => m.MapKey("WIDGETSEQUENCE_ID"));
}
35
Eranga

Si vous ne souhaitez pas utiliser une syntaxe fluide, il existe trois autres façons d'implémenter la référence à l'aide d'annotations de données (personnellement, je préfère les annotations de données car elles semblent plus faciles à lire et écrites juste au-dessus de la propriété qu'elles affectent):

1.1) Utiliser ForeignKey (avec une propriété associée) - version 1

[Table("WIDGETENTITIES")]
public class WidgetEntity {

    [Column("WIDGETENTITY_ID")]
    public int Id { get; set; }

    [Column("WIDGETSEQUENCE_ID")]
    public int WidgetSequenceId { get; set; }

    [ForeignKey("WidgetSequenceId")] //Has to be a property name, not table column name
    public WidgetSequence Sequence { get; set; }

    // and other properties that map correctly
}

[Table("WIDGETSEQUENCES")]
public class WidgetSequence { 

    [Column("WIDGETSEQUENCE_ID")]
    public int Id { get; set; }

    [Column("NUMBER")]
    public int Number { get; set; }
}

1.2) Utiliser ForeignKey (avec une propriété associée) - version 2

[Table("WIDGETENTITIES")]
public class WidgetEntity {

    [Column("WIDGETENTITY_ID")]
    public int Id { get; set; }

    [ForeignKey("Sequence")] //Has to be a property name, not table column name
    [Column("WIDGETSEQUENCE_ID")]
    public int WidgetSequenceId { get; set; }

    public WidgetSequence Sequence { get; set; }

    // and other properties that map correctly
}

[Table("WIDGETSEQUENCES")]
public class WidgetSequence { 

    [Column("WIDGETSEQUENCE_ID")]
    public int Id { get; set; }

    [Column("NUMBER")]
    public int Number { get; set; }
}

2) Vous pouvez également utiliser InversePropertyAttribute.

[Table("WIDGETENTITIES")]
public class WidgetEntity {

    [Column("WIDGETENTITY_ID")]
    public int Id { get; set; }

    [InverseProperty("WidgetEntities")]
    public WidgetSequence Sequence { get; set; }

    // and other properties that map correctly
}

[Table("WIDGETSEQUENCES")]
public class WidgetSequence { 

    [Column("WIDGETSEQUENCE_ID")]
    public int Id { get; set; }

    [Column("NUMBER")]
    public int Number { get; set; }

    public virtual List<WidgetEntity> WidgetEntities { get; set; }
}
59
Richard J

Il y a une table appelée Users et elle a une clé primaire appelée UserID.

Il existe une autre table appelée Répertoire, et elle a une colonne appelée UserID qui est définie comme une clé étrangère de la table Utilisateurs.

Je peux utiliser l'annotation ForeignKey pour mapper la clé étrangère comme ceci:

[ForeignKey("xyzzy")]
public int? UserID { get; set; }  // This is a column in the table
public virtual User xyzzy { get; set; } // This is my instance of User
2
John Mott