@Entity Framework 4.1 Database First não adiciona uma chave primária à classe gerada pelo DbContext T4

Estou apenas começando com o Entity Framework 4.1, testando o modo "banco de dados primeiro". Quando o EF gera uma classe Model com o "ADO.Net DbContext Generator", ele não deve identificar a chave primária da classe com um atributo [Key]? Sem isso, parece incompatível com o T4 MVCScaffoldin

Aqui estão os detalhes

Usando a GUI do Entity Data Model Designer, adicionei uma tabela "país" simples ao modelo do meu banco de dados existente. A GUI identifica corretamente um único campo de chave de identidade inteira chamado "PK" como minha chave primária. (Infelizmente! Eu sou um usuário novo, não posso adicionar uma captura de tela. Em vez disso, incluí o CSDL.) No entanto, quando o EF gera código usando o "ADO.Net DbContext Generator", ele não identifica o PK campo como o campo-chave na classe gerada (consulte o trecho de código abaixo

O CSDL da tabela "país":

<edmx:ConceptualModels>
  <Schema Namespace="EpiDataModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
    <EntityContainer Name="EpiModelEntities" annotation:LazyLoadingEnabled="true">
      <EntitySet Name="countries" EntityType="EpiDataModel.country" />
    </EntityContainer>
    <EntityType Name="country">
      <Key>
        <PropertyRef Name="PK" />
      </Key>
      <Property Name="PK" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" />
      <Property Name="Abbreviation" Type="String" Nullable="false" MaxLength="200" Unicode="false" FixedLength="false" />
      <Property Name="Name" Type="String" MaxLength="1024" Unicode="false" FixedLength="false" />
      <Property Name="Description" Type="String" MaxLength="1024" Unicode="false" FixedLength="false" />
      <Property Name="Sequence" Type="Int32" />
    </EntityType>
  </Schema>
</edmx:ConceptualModels>

Aqui está o código gerado automaticamente:

//------------------------------------------------------------------------------
// <auto-generated>
//    This code was generated from a template.
//
//    Manual changes to this file may cause unexpected behavior in your application.
//    Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Collections.Generic;

namespace MvcApplication1.Areas.Epi.Models
{
    public partial class country
    {
        public int PK { get; set; }
        public string Abbreviation { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public Nullable<int> Sequence { get; set; }
    }
}

Isso causa um problema ao tentar montar um controlador usando o modelo MVCScaffolding T4. Recebo o erro "Nenhuma propriedade parece ser a chave primária". O comando e a saída do Console do NuGet Package Manager estão abaixo:

PM> scaffold controller MvcApplication1.Areas.Epi.Models.country -Area Epi -NoChildItems -DbContextType MvcApplication1.Areas.Epi.Models.EpiModelEntities -Force
Scaffolding countriesController...
Get-PrimaryKey : Cannot find primary key property for type 'MvcApplication1.Areas.Epi.Models.country'. No properties appear to be primary keys.
At C:\work\EPI\EPIC_MVC3\sandbox\MvcApplication1\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

No entanto, se eu alterar manualmente a classe gerada para adicionar um atributo [Key] ao campo, o mesmo comando de andaime mostrado acima funcionará bem:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; // manually added

namespace MvcApplication1.Areas.Epi.Models
{
    public partial class country
    {
        [Key]                        // manually added
        public int PK { get; set; }
        public string Abbreviation { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public Nullable<int> Sequence { get; set; }
    }
}

Então, por que o EF Database First e o T4 MVCScaffolding não funcionam bem juntos? E mesmo sem o problema do andaime, as classes EF não precisam saber quais são os campos-chave?

questionAnswers(2)

yourAnswerToTheQuestion