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);
}
}
}
DbContext Model:
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; }
}
}
Modell:
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;
}
}
Datenbanktabelle:
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);
Der obige Code listet alle Klassen auf, an denen ich arbeite. Beim Ausführen meiner Anwendung wird der Fehler angezeigt:
"Ein oder mehrere Validierungsfehler wurden während der Modellgenerierung festgestellt" zusammen mit "Entitätstyp hat keinen Schlüssel definiert".
Die Model-Klasse sollte folgendermaßen geändert werden:
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; }
}
}
Vergewissern Sie sich, dass öffentliche Mitglieder der Schülerklasse als properties w/{get; set;}
definiert sind (Ihre sind public variables - ein häufiger Fehler).
Platzieren Sie eine [Key]
-Anmerkung auf Ihrer ausgewählten Eigenschaft.
Dafür kann es mehrere Gründe geben. Einige davon fand ich hier , andere habe ich selbst entdeckt.
Id
hat, müssen Sie das [Key]
-Attribut hinzufügen.public
sein.uint
, ulong
usw. nicht zulässig sind.ich weiß, dass dieser Beitrag zu spät kommt, aber diese Lösung hat mir geholfen:
[Key]
[Column(Order = 0)]
public int RoleId { get; set; }
addierte [Spalte (Reihenfolge = 0)] nach [Schlüssel] kann durch Inkrementieren um 1 hinzugefügt werden:
[Key]
[Column(Order = 1)]
public int RoleIdName { get; set; }
usw...
In meinem Fall wurde der Fehler beim Erstellen eines "MVC 5-Controllers mit Ansicht mit Entity Framework" angezeigt.
Ich brauchte nur das Projekt zu erstellen, nachdem ich die Klasse Model erstellt hatte, und brauchte nicht die Annotation [Key].
Die Verwendung der [Taste] hat für mich nicht funktioniert, aber die Verwendung einer id -Eigenschaft tut dies ... Ich füge diese Eigenschaft einfach meiner Klasse hinzu.
public int id {get; set;}
Der Grund für das EF-Framework Prompt 'no key' besteht darin, dass das EF-Framework einen Primärschlüssel in der Datenbank benötigt. Um EF eindeutig zu sagen, um welche Eigenschaft es sich bei dem Schlüssel handelt, fügen Sie eine [Key]
-Anmerkung hinzu. Oder fügen Sie am schnellsten eine ID
-Eigenschaft hinzu. Dann nimmt das EF-Framework standardmäßig ID
als Primärschlüssel an.
Das Objekt muss ein Feld enthalten, das als Primary Key
verwendet wird. Wenn Sie ein Feld mit dem Namen Id
haben, ist dies standardmäßig der Primärschlüssel des Objekts, zu dem Entity Framework verlinkt wird.
Andernfalls sollten Sie das [Key]
-Attribut über dem Feld hinzufügen, das Sie als Primary Key
verwenden möchten. Außerdem müssen Sie den Namespace System.ComponentModel.DataAnnotations
hinzufügen:
public class myClass
{
public int Id { get; set; }
[Key]
public string Name { get; set; }
}
Vergessen Sie nicht, dass Sie daspublic- Keyword so hinzufügen
[Key]
int RoleId { get; set; } //wrong method
sie müssen das öffentliche Schlüsselwort so verwenden
[Key]
public int RoleId { get; set; } //correct method
Für mich war das Modell in Ordnung. Es war, weil ich 2 verschiedene Versionen des Entity Frameworks hatte. Eine Version für das Webprojekt und eine andere für das gemeinsame Projekt, das die Modelle enthält.
Ich musste nur die Nuget-Pakete konsolidieren.
Genießen!
Sie müssen nicht ständig Schlüsselattribute verwenden. Stellen Sie sicher, dass die Zuordnungsdatei den Schlüssel richtig adressiert hat
this.HasKey(t => t.Key);
this.ToTable("PacketHistory");
this.Property(p => p.Key)
.HasColumnName("PacketHistorySK");
und vergessen Sie nicht, das Mapping im OnModelCreating des Repositorys hinzuzufügen
modelBuilder.Configurations.Add(new PacketHistoryMap());
Alles ist richtig, aber in meinem Fall habe ich zwei Klassen wie diese
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; }
}
}
}
Nach dem Löschen der Oberklasse funktioniert es gut für mich.