外键EF6的名称

时间:2015-01-20 19:40:16

标签: entity-framework ef-code-first

我的实体有List<SecondEntityDTO>。当EF生成表格时,在表格SecondEntities中有一个列名FirstEntityDTO_id。我希望此列名为“ParentEntity_id”。我怎么能这样做?

我尝试注释SecondEntityDTO列表以及其他一些东西......

编辑1:我相信你们很少被人理解 这是我的MainEntity:

[Table("MainEntities")]
public class MainEntityDTO
{
    public string Title { get; set; }
    [Key]
    public int id { get; set; }
    public List<SubEntityDTO> SubEntities { get; set; }
}

这是SubEntityDTO

[Table("SubEntities")]
public class SubEntityDTO
{
    [Key]
    public int id { get; set; }
    public string Title { get; set; }
}

这就是移民:

public override void Up()
    {            
        CreateTable(
            "dbo.MainEntities",
            c => new
                {
                    id = c.Int(nullable: false, identity: true),
                    Title = c.String(),
                    Discriminator = c.String(nullable: false, maxLength: 128),
                })
            .PrimaryKey(t => t.id);

        CreateTable(
            "dbo.SubEntities",
            c => new
                {
                    id = c.Int(nullable: false, identity: true),
                    Title = c.String(),
                    MainEntityDTO_id = c.Int(),
                })
            .PrimaryKey(t => t.id)
            .ForeignKey("dbo.MainEntities", t => t.MainEntityDTO_id)
            .Index(t => t.MainEntityDTO_id);
    }

请注意SubEntities表格中第三列的名称!

2 个答案:

答案 0 :(得分:1)

此外,您可以使用Fluent Api执行相同操作,例如,覆盖上下文的OnModelCreating方法并执行此操作:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<SecondEntity>().Property(s => s.FirstEntityDTO_id).HasColumnName("ParentEntity_id");
}

更新

为什么不编辑Func&lt;&gt;指定该表的列。如您所见,您正在创建一个匿名类型,因此您可以在那里更改列的名称,例如:

 CreateTable(
            "dbo.SubEntities",
            c => new
            {
                id = c.Int(nullable: false, identity: true),
                Title = c.String(),
                ParentEntity_id = c.Int(),
            })
            .PrimaryKey(t => t.id)
            .ForeignKey("dbo.MainEntities", t => t.ParentEntity_id)
            .Index(t => t.ParentEntity_id);

如果这样做,请记住在Down方法中更改该属性的名称,但如果您已经执行了该脚本,请不要在Down方法中更改FK名称。再次执行Update Database命令,指定该脚本的名称。这将删除这些表,它们将使用Up方法再次创建,但现在使用您想要的FK名称。在那一刻,您可以更改Down中的FK名称方法:

 public override void Down()
 {
        DropForeignKey("dbo.SubEntities", "ParentEntity_id", "dbo.MainEntities");
        DropIndex("dbo.SubEntities", new[] { "ParentEntity_id" });
        DropTable("dbo.SubEntities");
        DropTable("dbo.MainEntities");
 }

答案 1 :(得分:0)

将以下代码放入SubEntity班级:

[ForeignKey("ParentEntity")]
public int ParentEntity_id { get; set; }

public virtual MainEntity ParentEntity { get; set; }