poner - personalizar datagridview c#
AsignaciĆ³n de una clave externa con un nombre de columna personalizado (3)
Estoy usando Entity Framework 4.3 code-first con Oracle. Me aparece el siguiente error:
System.InvalidOperationException: ForeignKeyAttribute en la propiedad ''WidgetSequence'' en el tipo ''WidgetDistributor.WidgetEntity'' no es válido. El nombre de la clave externa ''WIDGETSEQUENCE_ID'' no se encontró en el tipo dependiente ''WidgetDistributor.WidgetEntity''. El valor Name debe ser una lista separada por comas de nombres de propiedades de claves foráneas.
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í?
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 para la tabla Usuarios.
Puedo usar la anotación ForeignKey para mapear la clave foránea de esta manera:
[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
Si no desea utilizar una sintaxis fluida, existen otras tres formas de implementar la referencia mediante anotaciones de datos (Personalmente prefiero las anotaciones de datos ya que parecen más fáciles de leer y están escritas justo encima de la propiedad a la que afectan):
1.1) Usar 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) Usar 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; }
}
ForeignKey
atributo ForeignKey
espera un nombre de propiedad en su clase como argumento, pero le ha dado el nombre de la columna. Use mapeos fluidos.
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<WidgetEntity>()
.HasRequired(w => w.Sequence)
.WithMany()
.Map(m => m.MapKey("WIDGETSEQUENCE_ID"));
}