カスタム列名を持つ外部キーのマッピング
OracleでEntity Framework 4.3コードファーストを使用しています。次のエラーが表示されます。
System.InvalidOperationException:タイプ 'WidgetDistributor.WidgetEntity'のプロパティ 'WidgetSequence'のForeignKeyAttributeは無効です。外部キー名「WIDGETSEQUENCE_ID」が依存型「WidgetDistributor.WidgetEntity」で見つかりませんでした。 Name値は、外部キープロパティ名のコンマ区切りリストである必要があります。
私のエンティティは次のようなものです。
[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; }
}
私のコードは正しいようです。ここで間違ったことは何ですか?
ForeignKey
attibuteは、クラス内のプロパティ名を引数として予期しますが、列名を指定しました。流なマッピングを使用します。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<WidgetEntity>()
.HasRequired(w => w.Sequence)
.WithMany()
.Map(m => m.MapKey("WIDGETSEQUENCE_ID"));
}
流fluentな構文を使用したくない場合は、データ注釈を使用して参照を実装する他の3つの方法があります(個人的には、データ注釈は読みやすく、影響を受けるプロパティのすぐ上に記述されるため、データ注釈を好みます):
1.1)ForeignKeyを(関連するプロパティと共に)使用する-バージョン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)ForeignKeyを(関連するプロパティと共に)使用する-バージョン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)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; }
}
Usersというテーブルがあり、UserIDというプライマリキーがあります。
Directoryという別のテーブルがあり、Usersテーブルの外部キーとして定義されているUserIDという列があります。
ForeignKeyアノテーションを使用して、次のように外部キーをマッピングできます。
[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