2012-12-13 11 views
34

Sviluppo di un'applicazione ASP.net MVC 4 di base. È una semplice applicazione per il catalogo di prodotti, dove ho 2 tabelle di database ("Categoria" e "Prodotti")EntityType 'Category' non ha una chiave definita. Definire la chiave per questo EntityType

Esiste un riferimento di chiave esterna di "ID di categoria" (chiave primaria nella tabella delle categorie) nella tabella "Prodotti" .

Quando si esegue l'applicazione, visualizzo un messaggio di errore (elencato di seguito).

System.Data.Entity.Edm.EdmEntityType: : EntityType 'Category' has no key defined. Define the key for this EntityType. 

System.Data.Entity.Edm.EdmEntitySet: EntityType: EntitySet 'Category' is based on type 'Category' that has no keys defined 

Questo appare come un errore comune per i neofiti, ho controllato tutte le soluzioni relative a 'chiave di entità '' non ha una chiave definita'. ma ancora il mio problema non è risolto, gentilmente aiutami a capire questo problema e qual è la soluzione corretta a questo problema.

Qui di seguito sono le mie classi del modello

Category.cs

namespace ChemicalStore.Models 
{ 
    public partial class Category 
    { 
     public int CatId { get; set; } 
     public string CatName { get; set; } 
     public string CatDescription { get; set; } 
     public List<Product> Product { get; set; } 
    }  
} 

Products.cs

namespace ChemicalStore.Models 
{ 
    public class Product 
    { 
     public int ProductId { get; set; } 
     public int CatId { get; set; } 
     public string ProductTitle { get; set; } 
     public string ProductPrice { get; set; } 
     public string ProductDescription { get; set; } 
     public string ProductPackage { get; set; } 
    } 
} 
+0

hmm .. perché questa domanda è contrassegnata come duplicata della domanda successiva? –

risposta

72

Si dovrebbe aggiungere l'attributo [Key] prima che la proprietà catid:

 using System.ComponentModel.DataAnnotations; 

     public partial class Category 
     { 
      [Key] 
      public int CatId { get; set; } 
      public string CatName { get; set; } 
      public string CatDescription { get; set; } 
      public List<Product> Product { get; set; } 
     } 

Il problema è che EF può funzionare solo quando conosce la chiave primaria della tabella. Per impostazione predefinita EF riconosce come proprietà della chiave primaria il nome Id. Se la tua tabella ha un'altra chiave primaria, puoi contrassegnarla con l'attributo [Chiave] o impostare la chiave con una configurazione fluente.

+2

Totalmente d'accordo. Per convenzione MVC si aspetta una proprietà denominata "CategoryId", ma si inserisce invece "CatId", quindi è necessario utilizzare l'annotazione dei dati e inserire [Chiave] per "CatId" per consentire a MVC di sapere che è la chiave primaria per la categoria del modello. – Nestor

+0

Grazie mille Sono un principiante e questo mi ha salvato da ulteriore frustrazione. – Apollo

+0

Ho lo stesso errore. Ma ho verificato che rispetto la convenzione la mia proprietà è 'public int AccountRoleId' Hai altre idee? – Kael

12

Entity Framework utilizza un campo chiave primaria per creare la colonna chiave primaria nella tabella generata.

Esso utilizza convenzione per ottenere questa colonna con alcune varianti:

  • Se il campo viene chiamato id o qualsiasi variazione involucro;
  • Se il campo è chiamato ClassNameId di qualsiasi variazione di involucro;

Potrei mancare qualche altra convenzione, ma questi sono i casi più comuni.

Se non si dispone di alcun campo con questo convenzioni è necessario marcare la chiave primaria desiderato con l'attributo [Key]:

[Key] 
public int CatId { get; set; } 
7

Basta posizionare [tasto] attributo id sopra ..

[Table("employee")] 

public class Employee 
{ 

    [Key] 

    public int Empno { set; get; } 

    public string Empname { set; get; }  
} 
0

classi di entità sono auto generato ..

modifiche manuali a tali file verranno sovrascritti se il il codice è rigenerato.

È necessario creare una classe parziale con tutto il tuo metadati

[MetadataType(typeof(Category.CategoryMetadata))] 
    public partial class Category 
    { 
     internal sealed class CategoryMetadata 
     { 
      [Key] 
      public int CatId { get; set; } 
      [Required] 
      public string CatName { get; set; } 
      public string CatDescription { get; set; } 
      public List<Product> Product { get; set; } 
     } 
    } 

Altre notizie su MSDN

+2

L'OP sembra utilizzare l'approccio code-first. Quindi questa risposta non si applica. – FrankO

0

Ciao, se hai trovato sotto l'errore. "" Uno o più errori di convalida sono stati rilevati durante la generazione del modello:

Checking.Models.Employee:: EntityType 'Employee' non ha alcuna chiave definita. Definire la chiave per questo EntityType. "" basta controllare il nome della colonna della tabella e il nome della proprietà definita uguali o no. se così non fosse corretto risolvilo.

0

Nel mio caso ho risolto questo problema aggiungendo il giusto connectionString nel file web.config/app.config.

Avevo dimenticato di aggiungerlo e DBContext non era in grado di comunicare con il DB.

Speranza che aiuta

7

sono stato in grado di risolvere questo con l'aggiunta di un setter di mia proprietà chiave; Ho avuto solo un getter prima.

public int Id { get; set; } 
+1

Ho scoperto che la mancanza di getter/setter farà scattare anche questa eccezione. Tenetelo a posto insieme all'attributo "Chiave" – LargeDachshund

+0

Un "set privato" è sufficiente –

Problemi correlati