2012-06-22 6 views
29

Estoy utilizando Entity Framework 4.3 code-first con Oracle. Estoy consiguiendo el error siguiente:Asignación de una clave externa con un nombre de columna personalizado

System.InvalidOperationException : The ForeignKeyAttribute on property 'WidgetSequence' on type 'WidgetDistributor.WidgetEntity' is not valid. The foreign key name 'WIDGETSEQUENCE_ID' was not found on the dependent type 'WidgetDistributor.WidgetEntity'. The Name value should be a comma separated list of foreign key property names.

Mis entidades son así:

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

Mi código parece correcto. ¿Qué he hecho mal aquí?

Respuesta

28

ForeignKey attibute espera un nombre de propiedad en su clase como argumento pero le ha dado el nombre de columna. Use mapeos fluidos.

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

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

Gracias por la respuesta. ¿Qué pasa con este problema? ¿Podría echar un vistazo a por favor? Gracias de antemano ... http://stackoverflow.com/questions/29333787/how-to-create-lookup-table-and-define-relationships –

47

Si no desea utilizar la sintaxis fluida, hay otras tres formas de implementar la referencia utilizando las anotaciones de datos (personalmente prefiero anotaciones de datos, ya que parece más fácil de leer y se escriben justo por encima de la propiedad que están afectando):

1,1) uso ForeignKey (con una propiedad asociada) - versión 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) uso ForeignKey (con una propiedad asociada) - versión 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) También puede usar 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; } 
} 
+0

¡Gracias por esto! La documentación y algunas otras respuestas de SO sugieren que el atributo de clave externa se puede usar donde realmente debería estar la propiedad inversa. – Carl

+0

@Carl, y esas sugerencias que encontraste no son las correctas. El atributo FK va por encima de la columna, no la propiedad inversa. – vapcguy

+0

@RichardPierre Gracias por responder. Sin embargo, no puedo hacer referencia a otra columna, excepto desde la columna Id con InverseProperty. ¿Qué pasa con este problema? ¿Qué tiene de malo? http://stackoverflow.com/questions/29327772/how-to-define-matching-column-in-inverseproperty?noredirect=1#comment46851150_29327772 –

0

Hay una tabla llamada Usuarios y tiene una clave principal llamada ID de usuario.

Hay otra tabla llamada Directorio, y tiene una columna llamada ID de usuario que se define como una clave externa a la tabla Usuarios.

soy capaz de utilizar la anotación ForeignKey para asignar la clave externa como esto:

[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 
Cuestiones relacionadas