I'm just getting started with Entity Framework 4.1, checking the "database first" mode. When EF generates a Model class with "ADO.Net DbContext Generator", should it not identify the primary key for the class with the [Key] attribute? Without it, it seems incompatible with the T4 MVCScaffolding.
Here are the details:
Using the Designer Data Entity Data Modeler GUI, I added a simple country table to my model from my existing database. The GUI correctly identifies a single integer identity key field with the name "PK" as my primary key. (Alas, I am a new user, so I can’t add a screenshot. I turned on CSDL instead.) However, when EF generates code using the “ADO.Net DbContext Generator”, it does not identify the PC field as the key field in the generated class ( see code excerpt below).
CSDL for country table:
<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>
Here's the autogenerated code:
This causes a problem when I try to tint a controller using the MVCScaffolding T4 template. I get the error "No properties are primary keys." Command and output from the NuGet Package Manager console:
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
However, if I manually modified the generated class to add the [Key] attribute to the field, then the exact same scaffolding command shown above works fine:
using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations;
So why aren't EF Database First and T4 MVCScaffolding playing well together? And even without problems with forests, should EF classes not know what a key field is?
Martin_ATS
source share