I'm using Entity Framework 4.3 code-first with Oracle. I'm getting the following error:
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.
My entities are like this:
[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; } }
My code seems correct. What have I done wrong, here?
A foreign key can also have different column names than the primary key. The foreign key and primary key can also have different default values. However, since values in the referenced table must be unique, default values are not much used and are rarely used for columns that are part of a primary key.
If you don't want to use fluent syntax, there are three other ways of implementing the reference using data annotations (Personally I prefer data annotations as they seem easier to read and are written just above the property they are affecting):
1.1) Use ForeignKey (with an associated property) - 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) Use ForeignKey (with an associated property) - 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) You can also use the 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
attibute expects a property name in your class as the argument but you given the column name. Use fluent mappings.
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<WidgetEntity>() .HasRequired(w => w.Sequence) .WithMany() .Map(m => m.MapKey("WIDGETSEQUENCE_ID")); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With