MVC3 / Razor添加控制器“Get-Primary Key”无法找到主键

时间:2011-11-21 21:52:43

标签: asp.net-mvc-3 entity-framework-4.1 primary-key dbcontext asp.net-mvc-scaffolding

我已经基于现有数据库创建了一个实体框架模型。实体框架正在使用ADO.NET DbContext Generator。

我还创建了一个使用第一个项目的DLL的MVC3 / Razor项目。当我点击“Add - > Controller”选项并填写必填字段时,我收到一个恼人的错误:

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

为了解决这个问题,我需要转到Visual Studio生成的Groups.c并添加'using System.ComponentModel.DataAnnotations;'然后将[Key]添加到Groups字段的声明中。但是这是生成的代码。如果我重新编译实体框架项目,我的更改当然会丢失。

所以 - 我的问题是:

我做错了什么导致Visual Studio无法弄清楚Key字段是什么,或者这只是Scaffolding Code的一个错误,它阻止它弄清楚Key是

我应该提一下,这只能通过基于字符串的主键失败。如果该字段已被声明为整数,那么一切都很完美。

这是有问题的表格:

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
  •  
  • 带SP3的SQL Server 2008
  • 2 个答案:

    答案 0 :(得分:1)

    我认为MVC Scaffolding作为一种惯例,希望主键在属性名称上有“Id”,但我不确定。
    如果可能,在您的情况下,我将创建一个surrogate key作为表的主键,以便在需要更改group_name时,我不必处理可能出现的问题。

    答案 1 :(得分:1)

    默认情况下,EF会将属性视为PrimaryKey,前提是它的格式为ID{TableName}ID ...在您的情况下,它应为GroupNameId或Id。

    第二个选项是字段上方的Group_name by adding/decorating [Key]属性。