Сначала код EF - имя ограничения пользовательского внешнего ключа

Интересно, есть ли шанс изменить имя ограничения внешнего ключа, сгенерированного Entity Framework при первом использовании кода.

У меня есть два объекта - User и Group - с отношением "многие ко многим", поэтому существует таблица ассоциаций GroupUser. К сожалению, автоматически сгенерированные ограничения внешнего ключа называются FK_dbo.GroupUser_dbo.User_User_UserId и FK_dbo.GroupUser_dbo.Group_Group_GroupId.

Я хотел бы иметь ограничения внешнего ключа, называемые FK_GroupUser_UserId и FK_GroupUser_GroupId. Это выглядит намного чище для меня.

Ответ 1

Невозможно настроить имя ограничения внешнего ключа с аннотациями данных или 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")
    
            // ...
        }
    }
    

Ответ 2

Вы можете реализовать пользовательский класс генератора sql, полученный из SqlServerMigrationSqlGenerator из System.Data.Entity.SqlServer

Более подробную информацию см. в .