【发布时间】: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