实体框架外键映射

时间:2016-05-28 23:58:21

标签: c# entity-framework entity-framework-6 ef-fluent-api

我试图确定EF6告诉我什么,而且对我来说没有多大意义,所以我希望有人在这里澄清一下。

我正在设置我的FluentApi(在数据库中使用的复合键,这是数据库中的Code First):

modelBuilder.Entity<Object1>()
    .HasKey(e => new { e.Property1, e.Property2 }
    .HasMany(e => e.Object2s)
    .WithRequired(e => e.Object1)
    .HasForeignKey(e => new { e.Property1, e.Property2 });

modelBuilder.Entity<Object2>()
    .HasKey(e => new { e.Property2, e.Property3, e.Property1 })
    .HasRequired(e => e.Object1)
    .WithMany(e => e.Object2s)
    .HasForeignKey(e => new { e.Property1, e.Property2 });

所有构建都很好,但是当我去选择任何东西时,我得到了这个:

  

&#34;外键约束&#39; Object1_Object2&#39;来自表Object2   (Property2,Property1)到表Object1(Property1,Property2)::   映射不足:必须将外键映射到某些键   参与外键的AssociationSet或EntitySets   概念方面的协会。&#34;

想法?当我在FluentApi中定义了正确的顺序时,我不明白为什么FK约束以错误的顺序显示Object2的FK。

2 个答案:

答案 0 :(得分:0)

尝试属性:

//using System.ComponentModel.DataAnnotations.Schema

public class Object1
{

    public int Property1{ get; set; }
    public string Property2 { get; set; }

    //Foreign key for Object2
    public int FK_Object2_Property { get; set; }

    [ForeignKey("FK_Object2_Property")]
    public Object2 Object2 { get; set; }
}
public class Object2
{

    public int Property1{ get; set; }
    public string Property2 { get; set; }

    public ICollection<Object1> Objects { get; set; }
}

答案 1 :(得分:0)

这最终是我必须做的 - 设置外键属性,并指定列顺序。 DB中的Code First具有Order = 2和Order = 0,因此我将其更改为:

public partial class Object2
{
    [Key]
    [Column("Property2", Order=2)]
    [ForeignKey("Object1")]
    public short Property2 { get; set; }

    [Key]
    [Column("Property3", Order=1)]
    public short Property3 { get; set; }

    [Key]
    [Column("Property1", Order=0)]
    [ForeignKey("Object1")]
    public int Property1 { get; set; }
}

我从Object1和Object2中删除了与此外键排列相关的FluentApi,并且一切都很好。一旦我确定如何在FluentApi中设置列顺序,我就会在FluentApi中重新执行此操作。

然后我必须将此添加到我的T4文件中以获取此对象...最终目标是能够在任何时候将DB重新生成到Code First而没有问题:)感谢所有人的帮助!