EF Code First - установить или влиять на ссылки на внешние ключи - PullRequest
3 голосов
/ 13 мая 2011

Я прочитал много постов о том, как указывать имя внешнего ключа в отношениях, проблем там нет.Однако я хотел бы знать, есть ли способ изменить имя первичных ключей и отношений?

Например, у вас есть таблица User с UserId в качестве первичного ключа.Первичный ключ называется PK_ Пользователь _1788CC4C07020F21 (или что-то в этом роде) при первом создании базы данных кода EF.Или у вас есть ссылка из вашей таблицы User на вашу таблицу UserVersion, которая EF называется UserVersion_User .Мне бы хотелось, чтобы первичный ключ назывался что-то вроде PK_User , а внешняя ссылка - как FK_UserVersion_User .

Есть ли способ сделать это?Некоторые соглашения отменяют или фактически могут указывать текст?

Спасибо.

Обновление: Основываясь на ответе и ссылке ниже, я сделал следующее в моем методе Seed.Это своего рода грубая сила, но я согласен с тем, что ее можно улучшить, особенно если вы создаете свободно распространяемые файлы конфигурации типа сущностей и т. Д. С помощью генератора.То же самое можно сделать для имен ссылок внешнего ключа.

    protected override void Seed(TodoDataContext context)
    {
        FixIndexes(context, "User");
        FixIndexes(context, "UserStats");
        FixIndexes(context, "UserRole");
        FixIndexes(context, "UserVersion");
        FixIndexes(context, "UserUserRoleVersion");
    }

    private void FixIndexes(TodoDataContext context, string tableName)
    {
        const string renamePrimaryKeySql = @"
            DECLARE @TableName NVARCHAR(128)
            DECLARE @IndexName NVARCHAR(128)
            DECLARE @OldName NVARCHAR(128)
            DECLARE @NewName NVARCHAR(128)
            SELECT  @TableName = '{0}'

            SELECT  @IndexName = C.CONSTRAINT_NAME
            FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ,INFORMATION_SCHEMA.KEY_COLUMN_USAGE C
            WHERE   pk.TABLE_NAME = @TableName
              AND   CONSTRAINT_TYPE = 'PRIMARY KEY'
              AND   C.TABLE_NAME = PK.TABLE_NAME
              AND   C.CONSTRAINT_NAME = PK.CONSTRAINT_NAME

            SELECT  @OldName = @TableName + '.' + @IndexName
            SELECT  @NewName = 'PK_' + @TableName

            exec sp_rename @OldName, @NewName, 'INDEX'";

        context.Database.ExecuteSqlCommand(string.Format(renamePrimaryKeySql, tableName));

1 Ответ

0 голосов
/ 13 мая 2011

Нет, невозможно изменить эти имена, если вы вручную не перетащите их в пользовательский инициализатор и не создадите их снова.EF не имеет подключаемых соглашений, поэтому вы не можете их переопределить.

...