web-dev-qa-db-ja.com

カスタム列名を持つ外部キーのマッピング

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

私のコードは正しいようです。ここで間違ったことは何ですか?

40

ForeignKey attibuteは、クラス内のプロパティ名を引数として予期しますが、列名を指定しました。流なマッピングを使用します。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

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

流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; }
}
59
Richard J

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
2
John Mott