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


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

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.


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 .

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


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


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

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


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

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.


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

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!


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.