类型为“Class1”的属性“MyField”上的ForeignKeyAttribute无效

时间:2016-04-05 14:27:39

标签: c# entity-framework foreign-keys one-to-many

使用实体框架(1对多关系)在外键上挣扎。

的Class1:

 public partial class Class1
    {

        public int Id { get; set; }
       [ForeignKey("Class2_Id")]
        public Class2 Class2{ get; set; }
...}

Class2:
 public partial class Class2
    {

        public int Id { get; set; }
        public virtual ICollection<Class1> Stuff{ get; set; }
...}

1)我尝试使用fluentAPI: 第一次尝试:

modelBuilder.Entity<Class2>().HasMany<Class1>(p => p.Stuff).WithOptional().Map(m => m.MapKey("Class2_Id")).WillCascadeOnDelete();

第二次尝试:

 modelBuilder.Entity<Class1>().HasRequired(i => i.Class2).WithMany().Map(m => m.MapKey("Class2_Id"));

2)没有fluentAPI: 我以这种方式宣布了有关的Class2字段:

[Column("Class2")]
public int Id { get; set; }

偶数(这可能毫无意义):

[ForeignKey("Class2")]
public int Id { get; set; }

我总是收到这个错误:

  

类型为“Class1”的属性“Class2”上的ForeignKeyAttribute无效。在。上找不到外键名称'Class2_Id'   依赖类型'Class1'。 Name值应以逗号分隔   外键属性名称列表。

知道出了什么问题吗?

提前thx。

1 个答案:

答案 0 :(得分:1)

使用流畅的api配置,您将定义单向关系,因此正确的方法是:

modelBuilder.Entity<Class2>().HasMany(p => p.Stuff)
                             .WithOptional(c=>c.Class2)
                             .Map(m => m.MapKey("Class2_Id"))
                             .WillCascadeOnDelete();
如果您不希望将外键作为模型类中的属性,则使用

MapKey方法。

当您将FK列表示为实体的属性时,请使用ForeignKey属性:

public partial class Class1
{

    public int Id { get; set; }

    public int? Class2_Id{ get; set; }

    [ForeignKey("Class2_Id")]
    public Class2 Class2{ get; set; }
}

在最后一种情况下,使用Fluent Api进行的关系配置为:

modelBuilder.Entity<Class2>().HasMany(p => p.Stuff)
                             .WithOptional(c=>c.Class2)
                             .HasForeignKey(c=>c.Class2_Id))
                             .WillCascadeOnDelete();