2013-07-29 64 views
13

我不知道是否有机会更改由实体框架生成的外键约束首次使用代码时的名称。EF代码优先 - 自定义外键约束名称

我有两个实体 - UserGroup - 有多对多的关系,所以有一个关联表GroupUser。不幸的是,自动生成的外键约束被命名为FK_dbo.GroupUser_dbo.User_User_UserIdFK_dbo.GroupUser_dbo.Group_Group_GroupId

我想要有外键约束,如FK_GroupUser_UserIdFK_GroupUser_GroupId。这对我来说看起来要干净得多。

+0

尝试 [如何对自定义,外键,科拉姆Ñ...] [1] [1]:http://stackoverflow.com/questions/5700645/how-to-customize-foreign-key-column-name-using-entity-framework-代码优先 – Nilesh

+0

那只是如何设置自定义列名而不是外键名。有很多关于自定义外键列名的问题和解答,但是我没有找到任何关于自定义外键名的问题。 – MrHenkey

回答

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

如何删除外键,如果它已经有一个自定义名称,因为生成的脚本使用字段名称,所以它不会因为它没有输入if语句而被删除 –

2

您可以实现从SqlServerMigrationSqlGeneratorSystem.Data.Entity.SqlServer派生的自定义SQL生成器类

更多datail普莱舍看到answer