我读过很多关于如何在关系中指定外键名称的帖子,没有问题。我想知道的是,有没有办法改变主键和关系的命名方式?
例如,您有一个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));