45

OracleでEntity Framework 4.3コードファーストを使用しています。次のエラーが表示されます。

System.InvalidOperationException : タイプ 'WidgetDistributor.WidgetEntity' のプロパティ 'WidgetSequence' の ForeignKeyAttribute が無効です。依存型「WidgetDistributor.WidgetEntity」で外部キー名「WIDGETSEQUENCE_ID」が見つかりませんでした。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; }
}

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

4

3 に答える 3

66

流暢な構文を使用したくない場合は、データ注釈を使用して参照を実装する方法が他に 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; }
}
于 2012-11-14T22:28:51.343 に答える
38

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

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<WidgetEntity>()
     .HasRequired(w => w.Sequence)
     .WithMany()
     .Map(m => m.MapKey("WIDGETSEQUENCE_ID"));
}
于 2012-06-22T00:44:48.653 に答える