我已经阅读了很多关于如何在关系中指定外键名称的文章,那里没有问题。 不过,我想知道的是,有没有办法更改主键和关系的命名方式?
例如,您有一个以 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 没有可插入约定,因此无法替代它们。