web-dev-qa-db-de.com

EntityType hat keinen durch den Schlüssel definierten Fehler

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".

128
Coder

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; }
    }
}
148
Coder
  1. Vergewissern Sie sich, dass öffentliche Mitglieder der Schülerklasse als properties w/{get; set;} definiert sind (Ihre sind public variables - ein häufiger Fehler).

  2. Platzieren Sie eine [Key]-Anmerkung auf Ihrer ausgewählten Eigenschaft.

89
Larry Raymond

Dafür kann es mehrere Gründe geben. Einige davon fand ich hier , andere habe ich selbst entdeckt.

  • Wenn die Eigenschaft einen anderen Namen als Id hat, müssen Sie das [Key]-Attribut hinzufügen.
  • Der Schlüssel muss eine Eigenschaft sein, kein Feld.
  • Der Schlüssel muss public sein.
  • Der Schlüssel muss ein CLS-kompatibler Typ sein, was bedeutet, dass vorzeichenlose Typen wie uint, ulong usw. nicht zulässig sind.
  • Dieser Fehler kann auch durch Konfigurationsfehler verursacht werden.

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...

19
danigitman

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].

15
ChrisS

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

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.

1
UtillYou

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

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

1
Mayer Spitzer

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
1
Udara Kasun

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!

0
Daniel

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());
0
Tosh

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.

0
Debendra Dash