Entity Framework 4.1 Database Primero no agrega una clave primaria a la clase generada por DbContext T4

Acabo de comenzar con Entity Framework 4.1, probando el modo "base de datos primero". Cuando EF genera una clase Modelo con el "Generador ADO.Net DbContext", ¿no debería identificar la clave primaria para la clase con un atributo [Clave]? Sin esto, parece incompatible con el T4 MVCScaffolding.

Aquí están los detalles

Utilizando la GUI del Diseñador de modelo de datos de entidad, agregué una tabla simple de "país" al modelo desde mi base de datos existente. La GUI identifica correctamente un campo de clave de identidad de entero único llamado "PK" como mi clave principal. (¡Ay! Soy un usuario nuevo, así que no puedo agregar una captura de pantalla. En su lugar, he incluido el CSDL a continuación). Sin embargo, cuando EF genera código utilizando el "Generador de contexto DbConNet de ADO.Net", no identifica la PK campo como el campo clave en la clase generada (vea el extracto de código a continuación).

El CSDL para la tabla "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>

Aquí está el código autogenerado:

//------------------------------------------------------------------------------
// <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; }
    }
}

Esto causa un problema cuando intento andamiar un controlador usando la plantilla MVCScaffolding T4. Aparece el error "No hay propiedades que parezcan claves principales". El comando y la salida de la consola de NuGet Package Manager se encuentran a continuación:

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

in embargo, si cambio manualmente la clase generada para agregar un atributo [Clave] al campo, entonces el mismo comando de andamiaje que se muestra arriba funciona bien:

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; }
    }
}

Entonces, ¿por qué EF Database First y el T4 MVCScaffolding no juegan bien juntos? E incluso sin el problema del andamiaje, ¿las clases EF no necesitan saber cuáles son los campos clave?

Respuestas a la pregunta(4)

Su respuesta a la pregunta