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".
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; }
}
}
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).
Placez une annotation [Key]
sur la propriété choisie.
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.
Id
, vous devez y ajouter l'attribut [Key]
.public
uint
, ulong
etc. ne sont pas autorisés.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...
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].
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;}
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.
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; }
}
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
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!
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());
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.