EntityType tidak memiliki kesalahan yang ditentukan kunci

145

Pengendali:

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

Model:

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

Tabel database:

CREATE TABLE [dbo].[studentdetails](
    [RollNo] [int] NULL,
    [Name] [nvarchar](50) NULL,
    [Stream] [nvarchar](50) NULL,
    [Div] [nvarchar](50) NULL
)  

Di global.asax.cs

Database.SetInitializer<MvcApplication1.Models.studentContext>(null);

Kode di atas mencantumkan semua kelas yang saya kerjakan. Saat menjalankan aplikasi saya menerima kesalahan:

"Satu atau lebih kesalahan validasi terdeteksi selama pembuatan model" bersama dengan "Jenis entitas tidak memiliki kunci yang ditentukan".

Coder
sumber
3
Periksa file repositori. Semua solusi di halaman ini luar biasa tetapi dalam kasus saya, saya melakukan semuanya dengan benar tetapi lupa untuk mendeklarasikan tabel sebagai DbSet dan menambahkannya ke konfigurasi modelbuilder.configuration.
Tosh
Dalam kasus saya, saya mengarahkan kode ke db lain dan meja hilang dari db
Kristina Lex

Jawaban:

168

Kelas Model harus diubah menjadi:

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; }
    }
}
Coder
sumber
1
kode saya berfungsi (tanpa [Key]) hingga saya mengubah tipe data (saya mengubahnya unsigned) dan hanya byte yang bekerja, apakah ada alasan saya tidak dapat menggunakan unsignednilai?
Mihai Bratulescu
5
Entity Framework tidak mendukung bilangan bulat tak bertanda msdn.microsoft.com/en-us/library/vstudio/…
user2316116
1
Dan jika Anda menggunakannya sebagai model di MVC, jangan lupa untuk membangun kembali!
RoJaIt
1
Banyak hal yang berbeda dapat menyebabkan kesalahan ini. Dalam kasus saya, saya keliru menandai "Id" bidang "pribadi" alih-alih "publik" (kebiasaan dari Jawa / JPA). Tanggapan Larry Raymond di bawah ini bisa dibilang adalah jawaban "terbaik" untuk pertanyaan ini. Ini mencantumkan sebagian besar skenario umum di belakang "EntityType tidak memiliki kesalahan kunci yang ditentukan".
paulsm4
98
  1. Pastikan anggota yakin masyarakat siswa kelas didefinisikan sebagai sifat w / {get; set;}(Anda adalah publik variabel - kesalahan umum).

  2. Tempatkan [Key]anotasi di atas properti yang Anda pilih.

Larry Raymond
sumber
Ini masalah saya. Terima kasih. Saya menerapkan antarmuka yang hanya memerlukan rajin untuk ID
Henry Ing-Simmons
81

Ada beberapa alasan mengapa hal ini bisa terjadi. Beberapa di antaranya saya temukan di sini , yang lain saya temukan sendiri.

  • Jika properti dinamai sesuatu selain Id, Anda perlu menambahkan [Key]atribut ke sana.
  • Kuncinya harus berupa properti, bukan bidang.
  • Kuncinya perlu public
  • Kuncinya harus tipe yang sesuai CLS, artinya jenis yang tidak ditandatangani seperti uint, ulongdll. Tidak diperbolehkan.
  • Kesalahan ini juga bisa disebabkan oleh kesalahan konfigurasi .
BlueRaja - Danny Pflughoeft
sumber
3
Saya juga menemukan bahwa properti utama harus baca-tulis. Saya mendapat kesalahan OP ketika memiliki pengambil dan tidak ada setter pada properti ID.
JohnFx
1
@ JohnFx benar-benar benar. Resharper dihapus private setdari beberapa properti selama pembersihan. Hasilnya adalah "EntityType tidak memiliki kesalahan kunci yang ditentukan". Jadi waspadalah terhadap alat pembersihan menghapus kode yang diperlukan.
jeremysawesome
Dalam kasus saya, saya menggunakan beberapa nama yang tidak berhubungan untuk menyebutkan ID kelas. Mengubah itu seperti yang disebutkan dalam solusi Anda memecahkan masalah saya. Terima kasih :)
Angela Amarapala
Jika Anda menggunakan properti apapun seperti ID, Id, ClassNameID, ClassNameIdAnda tidak perlu harus menggunakan[Key] attribute
Pranav Bilurkar
21

saya tahu bahwa posting ini terlambat tetapi solusi ini membantu saya:

    [Key]
    [Column(Order = 0)]
    public int RoleId { get; set; }

ditambahkan [Kolom (Urutan = 0)] setelah [Kunci] dapat ditambahkan dengan selisih 1:

    [Key]
    [Column(Order = 1)]
    public int RoleIdName { get; set; }

dll ...

danigitman
sumber
Ini berhasil bagi saya. Saya sudah memiliki [Key] tetapi menambahkan urutan menyelesaikannya.
Jaitsujin
19

Dalam kasus saya, saya mendapatkan kesalahan saat membuat "MVC 5 Controller with view, menggunakan Entity Framework".

Saya hanya perlu membangun proyek setelah membuat kelas Model dan tidak perlu menggunakan anotasi [Kunci].

ChrisS
sumber
2
Ya - 'Selanjutnya, bangun proyek. Perancah API Web menggunakan refleksi untuk menemukan kelas model, sehingga perlu perakitan yang dikompilasi. ' diambil dari halaman ini
Adam
Persis. Hanya "build" yang berfungsi, dan tidak ada jawaban lain sebelumnya yang berfungsi! Saya mencoba banyak cara dan akhirnya saya membangunnya dan berhasil! Kemudian saya datang ke sini dan menemukan jawaban ini, yang merupakan jawaban yang benar.
William Hou
Bagus. ini adalah kasus saya, setelah build semua diselesaikan
alhpe
Ya .... Terima kasih .... Aneh ini adalah masalah dalam VS2019 baru yang diperbarui: D
JanBorup
11

Menggunakan [tombol] tidak berhasil untuk saya tetapi menggunakan properti id melakukannya. Saya hanya menambahkan properti ini di kelas saya.

public int id {get; set;}
William Bello
sumber
1
Perlu [Key], tetapi properti yang disebut " id" juga akan berfungsi.
Michael Blackburn
public int Id {get; set; } atau [key] ^ public int Id1 {get; set; }
lava
6

Objek harus berisi bidang yang akan digunakan sebagai Primary Key, jika Anda memiliki bidang bernamaId maka ini secara default akan menjadi kunci utama dari objek yang akan ditautkan dengan Kerangka Entitas.

Jika tidak, Anda harus menambahkan [Key]atribut di atas bidang yang ingin Anda gunakan sebagai Primary Key, dan Anda juga perlu menambahkan namespace System.ComponentModel.DataAnnotations:

public class myClass
{
    public int Id { get; set; }
    [Key]
    public string Name { get; set; }
}

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

Mayer Spitzer
sumber
Terima kasih! Menambahkan paket System.ComponentModel.Annotations Nuget ke proyek Unit Test kami memperbaiki kesalahan ini untuk saya. Saya menelepon Pembaruan DbMigrator dan gagal meskipun proyek Domain kami dengan model kami dan DbContext memiliki referensi Nuget. Kedua proyek membutuhkannya.
pwhe23
4

Selain itu Ingat, Jangan lupa untuk menambahkan kata kunci publik seperti ini

[Key] 
int RoleId { get; set; } //wrong method

Anda harus menggunakan kata kunci Publik seperti ini

[Key] 
public int RoleId { get; set; } //correct method
Udara Kasun
sumber
2

Alasan mengapa kerangka kerja EF meminta 'tidak ada kunci' adalah bahwa kerangka kerja EF membutuhkan kunci utama dalam basis data. Untuk memberi tahu secara deklaratif pada EF properti mana kuncinya, Anda menambahkan [Key]anotasi. Atau, cara tercepat, tambahkan IDproperti. Kemudian, kerangka kerja EF akan mengambil IDsebagai kunci utama secara default.

Utillou
sumber
Apa yang terjadi jika basis data memiliki lebih dari satu bidang yang diakhiri dengan ID? Pada regenerasi saya kehilangan atribut Key.
Richard Griffiths
Jika Anda membuat kode dari DB, salah satu kolom dalam tabel harus menjadi kunci utama tabel.
Michael Blackburn
Mengenai "mengedit" kode yang dihasilkan, hampir selalu dihasilkan sebagai partialkelas. Anda dapat membuat file kedua sebagai partialkelas dengan nama yang sama, dan menambahkan properti lagi dengan [Key]atribut.
Michael Blackburn
1

Anda tidak harus menggunakan atribut kunci sepanjang waktu. Pastikan file pemetaan ditujukan dengan benar

this.HasKey(t => t.Key);
this.ToTable("PacketHistory");
this.Property(p => p.Key)
            .HasColumnName("PacketHistorySK");

dan jangan lupa untuk menambahkan pemetaan di OnModelCreating Repositori

modelBuilder.Configurations.Add(new PacketHistoryMap());
Omong kosong
sumber
1

Bagi saya, modelnya baik-baik saja. Itu karena saya punya 2 versi kerangka kerja yang berbeda. Satu versi untuk proyek web dan satu lagi untuk proyek umum yang berisi model.

Saya hanya perlu mengkonsolidasikan paket nuget .

masukkan deskripsi gambar di sini

Nikmati!

Daniel
sumber
Apa yang Anda maksud dengan "mengkonsolidasikan paket nuget"? Saya belum pernah mendengar tentang ini ....
Rob Washington
0

Semua benar tetapi dalam kasus saya, saya memiliki dua kelas seperti ini

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

Setelah menghapus kelas atas itu berfungsi dengan baik untuk saya.

Debendra Dash
sumber