6

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

我还创建了一个使用第一个项目中的 DLL 的 MVC3/Razor 项目。当我单击选项“添加 -> 控制器”并填写必填字段时,我收到一个烦人的错误:

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.cs 并添加“使用 System.ComponentModel.DataAnnotations;” 然后将 [Key] 添加到 Groups 字段的声明中。但是,这是生成的代码。如果我重新编译实体框架项目,我的更改当然会丢失。

所以 - 我的问题是:

我是否做错了什么导致 Visual Studio 无法弄清楚 Key 字段是什么,或者这只是脚手架代码的一个错误,它阻止它弄清楚 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]

这是我的环境:

  • 视觉工作室 2010
  • 实体框架 4.1
  • MVC 3
  • 带有 SP3 的 SQL Server 2008
  • 4

    2 回答 2

    1

    我相信 MVC Scaffolding 作为约定,期望主键在属性名称上具有“Id”,但我不确定。
    如果可能,在您的情况下,我将创建一个代理键用作表的主键,这样当 group_name 需要更改时,我就不必处理可能出现的问题。

    于 2011-11-22T18:37:53.433 回答
    1

    默认情况下,EF 将属性视为 PrimaryKey,仅当它的格式为IDor {TableName}ID...在您的情况下,它应该是GroupNameIdor Id。

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

    于 2012-12-25T04:21:33.217 回答