首先是EF代码 - 自定义外键约束名称

时间:2013-07-29 14:16:55

标签: ef-code-first entity-framework-5

我想知道在首次使用代码时是否有机会更改Entity Framework生成的外键约束的名称。

我有两个实体 - UserGroup - 具有多对多关系,因此存在关联表GroupUser。遗憾的是,自动生成的外键约束名为FK_dbo.GroupUser_dbo.User_User_UserIdFK_dbo.GroupUser_dbo.Group_Group_GroupId

我希望有类似FK_GroupUser_UserIdFK_GroupUser_GroupId的外键约束。这对我来说看起来更干净。

2 个答案:

答案 0 :(得分:6)

无法使用数据注释或DbModelBuilder Fluent API自定义外键约束名称。但是,您可以使用基于代码的迁移来控制名称。

  • 第一个选项:通过迁移创建表格时:

    为连接表自动生成的迁移代码如下所示:

    public partial class MyMigration : DbMigration
    {
        public override void Up()
        {
            CreateTable("GroupUser",
                c => new
                {
                    UserId = c.Int(nullable: false),
                    GroupId = c.Int(nullable: false),
                })
            .PrimaryKey(t => new { t.UserId, t.GroupId })
            .ForeignKey("User", t => t.UserId, cascadeDelete: true)
            .ForeignKey("Group", t => t.GroupId, cascadeDelete: true)
            .Index(t => t.UserId)
            .Index(t => t.GroupId);
    
            // ...
        }
    }
    

    您可以在此处修改两个ForeignKey方法调用,以便在调用update-database之前设置自定义约束名称:

            .ForeignKey("User", t => t.UserId, cascadeDelete: true,
                name: "FK_GroupUser_UserId")
            .ForeignKey("Group", t => t.GroupId, cascadeDelete: true,
                name: "FK_GroupUser_GroupId")
    
  • 第二个选项:当表已经存在时,您可以删除约束并在迁移中添加新的重命名:

    public partial class MyMigration : DbMigration
    {
        public override void Up()
        {
            DropForeignKey("UserGroup", "UserId", "User");
            DropForeignKey("UserGroup", "GroupId", "Group");
    
            AddForeignKey("UserGroup", "UserId", "User",
                name: "FK_GroupUser_UserId");
            AddForeignKey("UserGroup", "GroupId", "Group",
                name: "FK_GroupUser_GroupId")
    
            // ...
        }
    }
    

答案 1 :(得分:2)

您可以从SqlServerMigrationSqlGenerator

实现从System.Data.Entity.SqlServer派生的自定义sql生成器类

有关更多数据,请参阅answer