【问题标题】:EF Code First - Set or infulence the foreign key reference namesEF Code First - 设置或影响外键引用名称
【发布时间】:2011-05-13 14:42:46
【问题描述】:

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

例如,您有一个 User 表,其中 UserId 作为主键。 EF 代码优先数据库生成将主键称为 PK_User_1788CC4C07020F21(或类似名称)。或者你有一个从你的用户表到你的用户版本表的引用,它被 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));

【问题讨论】:

  • 嗨泰瑞尔,只是想说谢谢你的更新; FixIndexes 正是我正在寻找的,它完美地工作! :))
  • 有一个与 sp_rename 相关的错误。基本上,我们还必须更新 sys.key_constraints 列中的 is_system_named 列,这样如果\当我们在 SSMS 中生成创建脚本时,也会包含主键名称。看到这个:davidbrycehoward.com/archive/2011/01/…。这个错误应该会在 SQL Server 的下一个版本中修复,代号为“Denali”。
  • 要解决 is_system_name 问题,我必须做两件事:1. 将数据库部署到 sql server 2008 r2 和 2. 将 'OBJECT' 而不是 'INDEX' 传递给 sp_rename。

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


【解决方案1】:

没有办法更改这些名称,除非您手动将它们放入custom initializer 并重新创建它们。 EF 没有可插入的约定,因此您无法覆盖它们。

【讨论】:

  • 遗憾的是,这正是我所期待的。感谢您的回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
相关资源
最近更新 更多