6

我已經基於現有數據庫創建了實體框架模型。實體框架使用ADO.NET DbContext生成器。MVC3/Razor添加控制器「Get-PrimaryKey」未能找到主鍵

我還創建了一個MVC3/Razor項目,它使用第一個項目的DLL。當我點擊選擇「添加 - >控制器」,並填寫必填字段,我得到一個惱人的錯誤:

Scaffolding GroupController... 
EMR_MasterEntities already has a member called 'Groups'. Skipping... 
Get-PrimaryKey : Cannot find primary key property for type 'CHS.CCC.DataModel.Group'. No properties appear to be primar 
y keys. 
At C:\Users\adriangilbert\Desktop\CHS.Monitor\packages\MvcScaffolding.1.0.6\tools\Controller\MvcScaffolding.Controller. 
ps1:74 char:29 
+ $primaryKey = Get-PrimaryKey <<<< $foundModelType.FullName -Project $Project -ErrorIfNotFound 
    + CategoryInfo   : NotSpecified: (:) [Get-PrimaryKey], Exception 
    + FullyQualifiedErrorId : T4Scaffolding.Cmdlets.GetPrimaryKeyCmdlet 

要解決這個問題,我需要去到由視覺產生的Groups.cs Studio並添加'using System.ComponentModel.DataAnnotations;'然後將[Key]添加到Groups字段的聲明中。但是這是生成的代碼。如果我重新編譯實體框架項目,我的更改當然會丟失。

所以 - 我的問題是:

上午我做錯了什麼是導致Visual Studio來無法找出重點領域是什麼,或者這只是與那就是腳手架代碼中的錯誤防止弄清楚密鑰是什麼。

我應該提到,這隻有在基於字符串的主鍵時纔會失敗。如果該字段已被聲明爲整數,那麼一切都很完美。

這裏是有問題的表:

CREATE TABLE [dbo].[Groups](
    [group_name] [varchar](45) NOT NULL, 
    [dbname] [varchar](45) NOT NULL, 
    [user] [varchar](45) NULL, 
    [CompatibilityVersion] [nvarchar](20) NULL, 
    ... 

PRIMARY KEY CLUSTERED ([group_name] ASC) 
) ON [PRIMARY] 

下面是我的環境:

  • 的Visual Studio 2010
  • 實體框架4.1
  • MVC 3
  • 的SQL Server 2008 SP3
  • +0

    你是如何指定實體的? – cpoDesign

    回答

    1

    我認爲MVC腳手架作爲一種慣例,期望主鍵h作爲物業名稱上的「Id」,但我不確定。
    如果可能,在你的情況下,我會創建一個surrogate key作爲表的主鍵,這樣當需要更改group_name時,我不必處理會出現的問題。

    +0

    我試了幾個變種。 MvcScaffolding感冒似乎依賴於數據類型,而不是屬性名稱。添加一個代理鍵不是一種選擇,我不能改變數據庫模式而不會影響傳統應用程序 - 無論如何,我提到的解決方法確實讓我超越了這個問題,但我仍然認爲這是MvcScaffolding中的一個錯誤。 – Adrian

    +0

    由於您無法更改數據庫架構,因此可以更改T4模板以將DataAnnotation [Key]添加到您的類中。這樣,當你更新你的模型時,你不會鬆動。 –

    1

    默認情況下,EF認爲屬性爲PrimaryKey,只有格式爲ID{TableName}ID ...在您的情況下,它應該是GroupNameId或Id。

    第二個選項是Group_name by adding/decorating [Key]字段上方的屬性。