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; }
}
}
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.
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:
id
ou tout écart de casse;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; }
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; }
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; }
}
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.
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
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