EF Code First - 设置或影响外键引用名称

时间:2011-05-13 14:42:47

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

我读过很多关于如何在关系中指定外键名称的帖子,没有问题。我想知道的是,有没有办法改变主键和关系的命名方式?

例如,您有一个User表,其中UserId作为主键。 EF代码首次生成数据库时,主键称为 PK_ 用户 _1788CC4C07020F21 (或类似名称)。或者您有一个从User表到UserVersion表的引用,以及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));

1 个答案:

答案 0 :(得分:0)

除非您在custom initializer中手动删除这些名称并再次创建,否则无法更改这些名称。 EF没有可插入的约定,因此您无法覆盖它们。