EntityType non contiene errori definiti dalla chiave


145

controller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Models;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcApplication1.Controllers
{
    public class studentsController : Controller
    {
        //
        // GET: /students/

        public ActionResult details()
        {
            int id = 16;
            studentContext std = new studentContext();
           student first = std.details.Single(m => m.RollNo == id);
            return View(first);
        }

    }
}

Modello DbContext:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace MvcApplication1.Models
{
    public class studentContext : DbContext
    {
        public DbSet<student> details { get; set; }
    }
}

Modello:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;

namespace MvcApplication1.Models
{
    [Table("studentdetails")]
    public class student
    {
        public int RollNo;
        public string Name;
        public string Stream;
        public string Div;
    }
}

Tabella del database:

CREATE TABLE [dbo].[studentdetails](
    [RollNo] [int] NULL,
    [Name] [nvarchar](50) NULL,
    [Stream] [nvarchar](50) NULL,
    [Div] [nvarchar](50) NULL
)  

In global.asax.cs

Database.SetInitializer<MvcApplication1.Models.studentContext>(null);

Il codice sopra elenca tutte le classi su cui sto lavorando. Quando eseguo la mia domanda, ricevo l'errore:

"Durante la generazione del modello sono stati rilevati uno o più errori di convalida" insieme a "Il tipo di entità non ha una chiave definita".


3
Controlla il file del repository. Tutte le soluzioni in questa pagina sono fantastiche, ma nel mio caso, ho fatto tutto bene, ma ho dimenticato di dichiarare la tabella come DbSet e aggiungerla a modelbuilder.configurations.
Tosh,

Nel mio caso, ho indicato il codice su un altro db e la tabella mancava da db
Kristina Lex,

Risposte:


168

La classe del modello deve essere modificata in:

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations;

namespace MvcApplication1.Models
{
    [Table("studentdetails")]
    public class student
    {
        [Key]
        public int RollNo { get; set; }

        public string Name { get; set; }

        public string Stream { get; set; }

        public string Div { get; set; }
    }
}

1
il mio codice ha funzionato (senza [Key]) fino a quando non ho cambiato i tipi di dati (li ho cambiati in unsigned) e solo byte funziona c'è un motivo per cui non posso usare i unsignedvalori?
Mihai Bratulescu,

5
Entity Framework non supporta interi senza segno msdn.microsoft.com/en-us/library/vstudio/...
user2316116

1
E se lo stai usando come modello in MVC, non dimenticare di ricostruire!
RoJaIt

1
Molte cose diverse possono causare questo errore. Nel mio caso, ho erroneamente contrassegnato il mio campo "Id" "privato" anziché "pubblico" (un'abitudine da Java / JPA). La risposta di Larry Raymond di seguito è probabilmente la "migliore" risposta a questa domanda. Elenca la maggior parte degli scenari comuni dietro "EntityType non presenta errori definiti dalla chiave".
paulsm4,

98
  1. Assicurati che i membri pubblici della classe degli studenti siano definiti come proprietà con {get; set;}(le tue sono variabili pubbliche - un errore comune).

  2. Posiziona [Key]un'annotazione sopra la proprietà scelta.


Questo era il mio problema Grazie. Stavo implementando un'interfaccia che richiede solo un getter per ID
Henry Ing-Simmons,

81

Ci sono diverse ragioni per cui ciò può accadere. Alcuni di questi li ho trovati qui , altri li ho scoperti da solo.

  • Se la proprietà ha un nome diverso da Id, è necessario aggiungere l' [Key]attributo ad essa.
  • La chiave deve essere una proprietà, non un campo.
  • La chiave deve essere public
  • La chiave deve essere un tipo conforme a CLS, il che significa che tipi non firmati come uint, ulongecc. Non sono consentiti.
  • Questo errore può anche essere causato da errori di configurazione .

3
Ho anche scoperto che la proprietà chiave deve essere di lettura-scrittura. Ho ricevuto l'errore di OP quando avevo un getter e nessun setter sulla proprietà ID.
JohnFx,

1
@JohnFx è assolutamente corretto. Resharper rimosso private setda alcune proprietà durante una pulizia. Il risultato è stato "EntityType non ha errori definiti dalla chiave". Quindi fai attenzione agli strumenti di pulizia che rimuovono il codice necessario.
jeremysawesome

Nel mio caso, ho usato un nome non correlato per menzionare l'ID della classe. Modificarlo come indicato nella soluzione ha risolto il mio problema. Grazie :)
Angela Amarapala,

Se si utilizza qualsiasi proprietà come ID, Id, ClassNameID, ClassNameIdnon è necessario usare[Key] attribute
Pranav Bilurkar

21

so che questo post è in ritardo ma questa soluzione mi ha aiutato:

    [Key]
    [Column(Order = 0)]
    public int RoleId { get; set; }

aggiunto [Colonna (Ordine = 0)] dopo [Chiave] può essere aggiunto incrementando di 1:

    [Key]
    [Column(Order = 1)]
    public int RoleIdName { get; set; }

eccetera...


Questo ha fatto il trucco per me. Avevo già [Chiave] ma l'aggiunta dell'ordine risolto.
Jaitsujin,

19

Nel mio caso, ho riscontrato l'errore durante la creazione di un "Controller MVC 5 con vista, utilizzando Entity Framework".

Avevo solo bisogno di costruire il progetto dopo aver creato la classe Model e non avevo bisogno di usare l'annotazione [Key].


2
Sì - "Successivamente, crea il progetto. Lo scaffolding dell'API Web utilizza la riflessione per trovare le classi del modello, quindi necessita dell'assembly compilato ". tratto da questa pagina
Adam,

Esattamente. Funziona solo "build" e nessuna delle altre risposte precedenti lo fa! Ho provato molti modi e alla fine l'ho costruito e ha funzionato! Poi sono venuto qui e ho trovato questa risposta, che è la risposta corretta.
William Hou,

grande. questo è stato il mio caso, dopo che tutto è stato risolto
alhpe

Sì .... GRAZIE .... Strano questo è un problema in un nuovo VS2019 aggiornato: D
JanBorup

11

L'uso del [tasto] non ha funzionato per me, ma l'utilizzo di una proprietà id lo fa. Ho appena aggiunto questa proprietà nella mia classe.

public int id {get; set;}

1
Deve esserlo [Key], ma funzionerà anche una proprietà chiamata " id".
Michael Blackburn,

public int Id {get; impostato; } o [chiave] ^ public int Id1 {get; impostato; }
lava

6

L'oggetto deve contenere un campo che verrà utilizzato come Primary Key, se si dispone di un campo denominato, Idquesta sarà per impostazione predefinita la chiave primaria dell'oggetto a cui si collegherà Entity Framework.

Altrimenti, dovresti aggiungere l' [Key]attributo sopra quel campo che vuoi usare come Primary Key, e dovrai anche aggiungere lo spazio dei nomi System.ComponentModel.DataAnnotations:

public class myClass
{
    public int Id { get; set; }
    [Key]
    public string Name { get; set; }
}

https://stackoverflow.com/a/51180941/7003760


Grazie! L'aggiunta del pacchetto Nuget System.ComponentModel.Annotations al nostro progetto Test unit ha risolto questo errore per me. Stavo chiamando DbMigrator Update e non funzionava anche se il nostro progetto Dominio con i nostri modelli e DbContext aveva il riferimento Nuget. Entrambi i progetti ne hanno bisogno.
pwhe23

4

Inoltre, ricorda, non dimenticare di aggiungere una parola chiave pubblica come questa

[Key] 
int RoleId { get; set; } //wrong method

devi usare una parola chiave pubblica in questo modo

[Key] 
public int RoleId { get; set; } //correct method

2

Il motivo per cui il framework EF richiede "nessuna chiave" è che il framework EF necessita di una chiave primaria nel database. Per dire in modo dichiarativo a EF quale proprietà è la chiave, aggiungi [Key]un'annotazione. Oppure, nel modo più rapido, aggiungi una IDproprietà. Quindi, il framework EF assumerà IDcome chiave primaria per impostazione predefinita.


Cosa succede se il database ha più di un campo con l'ID suffisso? Alla rigenerazione perdo l'attributo Key.
Richard Griffiths,

Se stai generando il codice dal DB, una delle colonne nella tabella dovrebbe essere la chiave primaria della tabella.
Michael Blackburn,

Per quanto riguarda la "modifica" del codice generato, viene quasi sempre generato come partialclasse. È possibile creare un secondo file come partialclasse con lo stesso nome e aggiungere nuovamente la proprietà con l' [Key]attributo.
Michael Blackburn,

1

Non è necessario utilizzare l'attributo chiave in ogni momento. Assicurarsi che il file di mapping abbia indirizzato correttamente la chiave

this.HasKey(t => t.Key);
this.ToTable("PacketHistory");
this.Property(p => p.Key)
            .HasColumnName("PacketHistorySK");

e non dimenticare di aggiungere la mappatura in OnModelCreating del repository

modelBuilder.Configurations.Add(new PacketHistoryMap());

1

Per me, la modella andava bene. Era perché avevo 2 versioni diverse del framework delle entità. Una versione per il progetto Web e un'altra per il progetto comune che contiene i modelli.

Ho dovuto solo consolidare i pacchetti nuget .

inserisci qui la descrizione dell'immagine

Godere!


Cosa intendi con "consolidare i pacchetti nuget"? Non ne ho mai sentito parlare ....
Rob Washington,

0

Va bene, ma nel mio caso ho due classi come questa

namespace WebAPI.Model
{
   public class ProductsModel
{ 
        [Table("products")]
        public class Products
        {
            [Key]
            public int slno { get; set; }

            public int productId { get; set; }
            public string ProductName { get; set; }

            public int Price { get; set; }
}
        }
    }

Dopo aver eliminato la classe superiore, funziona bene per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.