web-dev-qa-db-fra.com

EntityType n'a pas d'erreur définie par clé

Manette:

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

    }
}

Modèle 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; }
    }
}

Modèle:

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

Table de base de données:

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

Dans global.asax.cs

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

Le code ci-dessus répertorie toutes les classes sur lesquelles je travaille. En exécutant mon application, je reçois l'erreur:

"Une ou plusieurs erreurs de validation ont été détectées lors de la génération du modèle", ainsi que "Le type d'entité n'a pas de clé définie".

128
Coder

La classe Model doit être changée en:

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; }
    }
}
148
Coder
  1. Assurez-vous que les membres publics de la classe de l’élève sont définis comme propriétés w/{get; set;} (les vôtres sont publics variables - une erreur courante).

  2. Placez une annotation [Key] sur la propriété choisie.

89
Larry Raymond

Cela peut arriver pour plusieurs raisons. Certaines d’entre elles ont été retrouvées ici , d’autres que j’ai découvertes par moi-même.

  • Si la propriété est nommée autrement que Id, vous devez y ajouter l'attribut [Key].
  • La clé doit être une propriété, pas un champ.
  • La clé doit être public
  • La clé doit être d'un type compatible CLS, ce qui signifie que les types non signés tels que uint, ulong etc. ne sont pas autorisés.
  • Cette erreur peut également être provoquée par des erreurs de configuration .

je sais que ce post est en retard mais cette solution m'a aidé:

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

ajouté [Colonne (Ordre = 0)] après [Clé] peut être ajouté par incrément de 1:

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

etc...

19
danigitman

Dans mon cas, le message d'erreur s'affichait lors de la création d'un "contrôleur MVC 5 avec vue utilisant Entity Framework".

Je devais juste construire le projet après avoir créé la classe Model et je n'avais pas besoin d'utiliser l'annotation [Key].

15
ChrisS

L'utilisation de la [clé] n'a pas fonctionné pour moi, mais l'utilisation d'une propriété id le fait… .. Je viens d'ajouter cette propriété dans ma classe.

public int id {get; set;}
7
William Bello

La raison pour laquelle le cadre EF invite «pas de clé» est que le cadre EF a besoin d'une clé primaire dans la base de données. Pour indiquer de manière déclarative à EF quelle propriété est la clé, vous ajoutez une annotation [Key]. Ou, de la manière la plus rapide, ajoutez une propriété ID. Ensuite, le cadre EF prendra ID comme clé primaire par défaut.

1
UtillYou

L'objet doit contenir un champ qui sera utilisé comme Primary Key. Si vous avez un champ nommé Id, il s'agira par défaut de la clé primaire de l'objet vers lequel Entity Framework sera lié. 

Sinon, vous devez ajouter l'attribut [Key] au-dessus du champ que vous souhaitez utiliser comme Primary Key, et vous devrez également ajouter l'espace de noms System.ComponentModel.DataAnnotations:

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

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

1
Mayer Spitzer

De plus, n'oubliez pas, ajoutezpublicmot clé comme ceci

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

vous devez utiliser un mot clé public comme celui-ci

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

Pour moi, le modèle était bien. C'était parce que j'avais 2 versions différentes du framework entity. Une version pour le projet Web et une autre pour le projet commun contenant les modèles.

Je venais juste de consolider les paquets de nuget .

Prendre plaisir!

0
Daniel

Vous n'êtes pas obligé d'utiliser l'attribut clé tout le temps. Assurez-vous que le fichier de mappage a correctement adressé la clé

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

et n'oubliez pas d'ajouter le mappage dans OnModelCreating du référentiel

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

Tout va bien mais dans mon cas, j'ai deux cours comme celui-ci

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

Après avoir supprimé la classe supérieure, cela fonctionne bien pour moi.

0
Debendra Dash