6

Ho creato un modello di Entity Framework basato su un database esistente. Entity Framework utilizza il generatore DbContext di ADO.NET.MVC3/Razor Aggiungi controller "Get-PrimaryKey" non riesce a trovare la chiave primaria

Ho anche creato un progetto MVC3/Razor che utilizza la DLL dal primo progetto. Quando scatto sopra l'opzione "Aggiungi -> Controller" e compila i campi richiesti ottengo un errore fastidioso:

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 

Per aggirare il problema, ho bisogno di andare alle Groups.cs che è stato generato da Visual Studio e aggiungere 'using System.ComponentModel.DataAnnotations;' e quindi aggiungere [Chiave] alla dichiarazione del campo Gruppi. Tuttavia questo è il codice generato. Se ricomparto il progetto Entity Framework, ovviamente le mie modifiche andranno perse.

Così - la mia domanda è:

sto facendo qualcosa di sbagliato che sta causando Visual Studio per non essere in grado di capire ciò che il campo chiave è, o è solo un bug con il Codice impalcatura che è impedendogli di capire che la chiave è.

Devo dire che questo non funziona solo con chiavi primarie basate su stringhe. Se il campo è stato dichiarato come numero intero, allora tutto funziona perfettamente.

Ecco la tabella problematica:

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] 

Ecco il mio ambiente:

  • Visual Studio 2010
  • Entity Framework 4.1
  • MVC 3
  • SQL Server 2008 con SP3
  • +0

    Come hai specificato la tua entità? – cpoDesign

    risposta

    1

    Credo che MVC Scaffolding, come una convenzione, si aspetti che la chiave primaria h come "Id" sul nome della proprietà, ma non ne sono sicuro.
    Se possibile, nel tuo caso creerei un surrogate key da utilizzare come chiave primaria per la tabella, in modo che quando il nome_gruppo debba essere modificato, non dovrei gestire i problemi che si presenterebbero.

    +0

    Ho provato un paio di varianti. Il freddo MvcScaffolding sembra fare affidamento sul tipo di dati, non sul nome della proprietà. L'aggiunta di una chiave surrogata non è un'opzione e non posso modificare lo schema del database senza influire sulle applicazioni legacy. Ad ogni modo, la soluzione che ho citato mi ha fatto superare il problema, ma continuo a pensare che si tratti di un bug in MvcScaffolding. – Adrian

    +0

    Poiché non è possibile modificare lo schema del database, è possibile modificare il modello T4 per aggiungere la [Chiave] DataAnnotation alla classe. In questo modo, non lo perderai quando aggiorni la tua modella. –

    1

    Per impostazione predefinita, EF considera la proprietà come PrimaryKey, solo se è nel formato ID o {TableName}ID ... nel tuo caso dovrebbe essere GroupNameId o Id.

    La seconda opzione è Group_name by adding/decorating [Key] Attributo sopra il campo.

    Problemi correlati