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

如果您不想使用流利的语法,还有其他三种使用数据注释实现引用的方法(我个人更喜欢数据注释,因为它们看起来更容易阅读并且写在它们影响的属性之上):

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

ForeignKeyattibute 需要您的类中的属性名称作为参数,但您给出了列名称。使用流畅的映射。

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 回答
3

有一个名为 Users 的表,它有一个名为 UserID 的主键。

还有一个名为 Directory 的表,它有一个名为 UserID 的列,它被定义为 Users 表的外键。

我可以使用 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
于 2017-11-07T16:17:11.173 回答