我已經閱讀了很多關於如何在關係中指定外鍵名稱的帖子,在那裏沒有問題。然而,我想知道的是,有沒有辦法改變主鍵和關係的命名方式?EF代碼優先 - 設置或大量的外鍵引用名稱
例如,您有一個以UserId作爲主鍵的用戶表。主密鑰稱爲PK_ 用戶 _1788CC4C07020F21(或類似的東西)由EF代碼第一代數據庫生成。或者你有一個從你的用戶表引用到你的UserVersion表,並且被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));
您好Tyrel,只是想說謝謝你的更新; FixIndexes正是我一直在尋找的,它完美的工作! :)) – 2011-06-15 02:49:03
有一個與sp_rename相關的錯誤。基本上,我們還必須更新sys.key_constraints列中的is_system_named列,以便當我們在SSMS中生成創建腳本時,例如,主鍵名也將包含在內。看到這個:http://davidbrycehoward.com/archive/2011/01/naming-and-renaming-database-constraints/。這個錯誤應該在代號爲「Denali」的SQL Server的下一個版本中修復。 – 2011-06-15 04:33:15
要修復is_system_name問題,我必須做兩件事:1.將數據庫部署到sql server 2008 r2並將「OBJECT」而不是'INDEX'傳遞給sp_rename。 – 2011-06-15 05:18:56