web-dev-qa-db-fra.com

EntityType 'Category' n'a pas de clé définie. Définissez la clé de ce type d'entité

Développement d'une application ASP.net MVC 4 de base. C'est une application de catalogue de produits simple, où j'ai 2 tables de base de données ("Catégorie" et "Produits")

Il existe une référence de clé étrangère de "Catégorie id" (clé primaire dans la table Catégorie) dans la table "Produits".

Lorsque j'exécute l'application, je reçois un message d'erreur (répertorié ci-dessous).

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

Cela ressemble à une erreur courante pour les débutants, j'ai vérifié toutes les solutions liées à la "clé d'entité" "n'a pas de clé définie". mais mon problème n'est toujours pas résolu, veuillez m'aider à comprendre ce problème et quelle est la bonne solution à ce problème.

Voici mes classes de modèles

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; }
    }
}
35
Saideep Kankarla

Vous devez ajouter l'attribut [Key] avant la propriété 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; }
        }

Le problème est que EF ne peut fonctionner que s'il connaît la clé primaire de la table. Par défaut, EF reconnaît comme propriété de clé primaire avec le nom Id. Si votre table a une autre clé primaire, vous pouvez la marquer avec l'attribut [Key] ou définir la clé avec une configuration fluide.

77
Kirill Bestemyanov

Entity Framework utilise un champ de clé primaire pour créer la colonne de clé primaire sur la table générée.

Il utilise la convention pour obtenir cette colonne avec quelques variantes:

  • Si le champ est appelé id ou tout écart de casse;
  • Si le champ est appelé ClassNameId de n'importe quelle variance de casse;

Il me manque peut-être d'autres conventions, mais ce sont les cas les plus courants.

Si vous n'avez aucun champ avec ces conventions, vous devez marquer votre clé primaire souhaitée avec l'attribut [Key]:

[Key]
public int CatId { get; set; }
12
Ricardo Souza

J'ai pu résoudre ce problème en ajoutant un setter à ma propriété de clé; Je n'avais qu'un getter avant.

public int Id { get; set; }
8
Corey Ford

Placez simplement l'attribut [key] sur l'ID ci-dessus.

[Table("employee")]

public class Employee
{ 

    [Key]

    public int Empno { set; get; }

    public string Empname { set; get; }      
}
7
Mahesh.P

Salut si vous obtenez une erreur ci-dessous. "" Une ou plusieurs erreurs de validation ont été détectées lors de la génération du modèle:

Checking.Models.Employee:: EntityType 'Employee' n'a pas de clé définie. Définissez la clé de ce type d'entité. "" Vérifiez simplement le nom de la colonne de votre table et le nom de la propriété définie. sinon, corrigez le problème résolu.

0
KULDEEP

Dans mon cas, j'ai résolu ce problème en ajoutant la bonne connexionString dans le fichier web.config/app.config.

J'avais oublié de l'ajouter et le DBContext n'a pas pu communiquer avec la base de données.

J'espère que ça aide

0
nano

Les classes d'entité sont générées automatiquement.

Les modifications manuelles de ces fichiers seront écrasées si le code est régénéré.

Vous devez créer une classe partielle avec toutes vos métadonnées

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

En savoir plus sur MSDN

0
Guish