实体框架 4.1 - EF 代码优先 - 设置或影响外键引用名称



我已经阅读了很多关于如何在关系中指定外键名称的文章,那里没有问题。 不过,我想知道的是,有没有办法更改主键和关系的命名方式?

例如,您有一个以 UserId 为主键的用户表。 主键由 EF 代码第一个数据库生成称为 PK_User_1788CC4C07020F21(或类似内容)。 或者,您有一个从用户表到用户版本表的引用,EF 将其称为UserVersion_User。 我希望主键称为类似PK_User,而外部引用称为FK_UserVersion_User

有没有办法做到这一点? 一些约定覆盖或实际上能够指定文本?

谢谢。

更新:根据下面的答案和链接,我在种子方法中做了以下操作。 这有点蛮力,但我发现它可以改进,特别是如果您使用生成器创建流畅的实体类型配置文件等。对于外键引用名称也可以执行相同的操作。

    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));
否,

除非您手动将它们放在自定义初始值设定项中并再次创建,否则无法更改这些名称。EF 没有可插入约定,因此无法替代它们。

最新更新