2011-05-13 41 views
3

我已經閱讀了很多關於如何在關係中指定外鍵名稱的帖子,在那裏沒有問題。然而,我想知道的是,有沒有辦法改變主鍵和關係的命名方式?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)); 
+0

您好Tyrel,只是想說謝謝你的更新; FixIndexes正是我一直在尋找的,它完美的工作! :)) – 2011-06-15 02:49:03

+0

有一個與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

+0

要修復is_system_name問題,我必須做兩件事:1.將數據庫部署到sql server 2008 r2並將「OBJECT」而不是'INDEX'傳遞給sp_rename。 – 2011-06-15 05:18:56

回答

0

沒有就沒有辦法改變這些名稱,除非你手動刪除他們custom initializer,並重新創建它們。 EF沒有可插入的約定,因此您無法重寫它們。

+0

不幸的是,這就是我期待的。感謝您的回覆。 – 2011-05-13 18:01:08