MVC3/Razor Add Controller "Get-PrimaryKey" не может найти первичный ключ
Я создал Entity Framework Model на основе существующей базы данных. Entity Framework использует генератор ADO.NET DbContext.
Я также создал проект 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, сгенерированному Visual Studio, и добавить "using System.ComponentModel.DataAnnotations;" и затем добавьте [Ключ] к объявлению поле Группы. Однако это сгенерированный код. Если я перекомпилирую Entity Framework Project, мои изменения, конечно, будут потеряны.
Итак - мой вопрос:
Я делаю что-то неправильно, из-за чего Visual Studio не может понять, что такое поле Key, или это просто ошибка в коде Scaffolding, которая не позволяет ему выяснить, что это за ключ.
Я должен упомянуть, что это терпит неудачу только с Основанными ключами на основе строки. Если поле было объявлено как Integer, то все работает отлично.
Вот проблемная таблица:
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]
Вот моя среда:
2 ответа
Я считаю, что MVC Scaffolding, как соглашение, ожидает, что первичный ключ имеет "Id" в имени свойства, но я не уверен.
Если возможно, в вашем случае я бы создал суррогатный ключ для использования в качестве первичного ключа для таблицы, чтобы при необходимости изменения имени_группы мне не приходилось обрабатывать возникающие проблемы.
По умолчанию EF рассматривает свойство как PrimaryKey, только если оно имеет формат ID
или же {TableName}ID
... в вашем случае это должно быть GroupNameId
или идентификатор
Второй вариант Group_name by adding/decorating [Key]
Атрибут над полем.