EntityType ไม่มีข้อผิดพลาดที่กำหนดคีย์


145

ควบคุม:

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

รุ่น:

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

ตารางฐานข้อมูล:

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

ใน global.asax.cs

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

รหัสด้านบนแสดงรายการชั้นเรียนทั้งหมดที่ฉันกำลังทำงานอยู่ เมื่อเรียกใช้แอปพลิเคชันของฉันฉันได้รับข้อผิดพลาด:

"ตรวจพบข้อผิดพลาดในการตรวจสอบหนึ่งข้อขึ้นไปในระหว่างการสร้างโมเดล" พร้อมกับ "ประเภทเอนทิตีไม่มีการกำหนดคีย์"


3
ตรวจสอบไฟล์ที่เก็บ โซลูชันทั้งหมดในหน้านี้น่าทึ่ง แต่ในกรณีของฉันฉันทำทุกอย่างถูกต้อง แต่ลืมที่จะประกาศตารางเป็น DbSet และเพิ่มลงใน modelbuilder.configurations
Tosh

ในกรณีของฉันฉันชี้รหัสไปยังฐานข้อมูลอื่นและตารางที่ขาดหายไปจากฐานข้อมูล
Kristina Lex

คำตอบ:


168

คลาส Model ควรเปลี่ยนเป็น:

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
รหัสของฉันทำงาน (ไม่มี[Key]) จนกว่าฉันจะเปลี่ยนประเภทข้อมูล (ฉันเปลี่ยนเป็นunsigned) และมีเพียงการทำงานของไบต์เท่านั้นที่มีเหตุผลที่ฉันไม่สามารถใช้unsignedค่าได้?
หมดเวลา Bratulescu

5
Entity Framework ไม่สนับสนุนจำนวนเต็มที่ไม่ได้ลงชื่อmsdn.microsoft.com/en-us/library/vstudio/ ......
2316116

1
และในกรณีที่คุณใช้เป็นโมเดลใน MVC อย่าลืมสร้างใหม่!
RoJaIt

1
สิ่งต่าง ๆ มากมายอาจทำให้เกิดข้อผิดพลาดนี้ ในกรณีของฉันฉันทำเครื่องหมายผิด "ส่วนตัว" ฟิลด์ "ส่วนตัว" แทน "สาธารณะ" (นิสัยจาก Java / JPA) คำตอบของ Larry Raymond ด้านล่างนี้เป็นคำตอบที่ดีที่สุดสำหรับคำถามนี้ มันแสดงสถานการณ์ทั่วไปส่วนใหญ่ที่อยู่เบื้องหลัง "EntityType ไม่มีข้อผิดพลาดที่กำหนดคีย์"
paulsm4

98
  1. ตรวจสอบให้แน่ใจว่าสมาชิกของประชาชนในระดับนักเรียนจะถูกกำหนดเป็นคุณสมบัติ w / {get; set;}(คุณเป็นสาธารณะตัวแปร - ข้อผิดพลาดทั่วไป)

  2. วาง[Key]คำอธิบายประกอบไว้ด้านบนของสถานที่ที่คุณเลือก


นี่เป็นปัญหาของฉัน ขอบคุณ ฉันกำลังใช้อินเทอร์เฟซซึ่งต้องการเพียง getter สำหรับ ID เท่านั้น
Henry Ing-Simmons

81

มีสาเหตุหลายประการที่สามารถเกิดขึ้นได้ ฉันพบสิ่งเหล่านี้ที่นี่บางอย่างฉันค้นพบด้วยตัวเอง

  • หากสถานที่ให้บริการมีชื่ออย่างอื่นที่นอกเหนือจากIdคุณจะต้องเพิ่ม[Key]คุณสมบัติให้
  • คีย์ต้องเป็นคุณสมบัติไม่ใช่ฟิลด์
  • ที่สำคัญต้องมี public
  • ความต้องการที่สำคัญจะเป็นประเภท CLS ที่สอดคล้องกับความหมายประเภทที่ไม่ได้ลงชื่อเหมือนuint, ulongฯลฯ ไม่ได้รับอนุญาต
  • ข้อผิดพลาดนี้อาจเกิดจากความผิดพลาดของการกำหนดค่า

3
ฉันยังพบว่าคุณสมบัติที่สำคัญจะต้องมีการอ่าน - เขียน ฉันพบข้อผิดพลาดของ OP เมื่อฉันมี getter และไม่มี setter ในคุณสมบัติ ID
JohnFx

1
@JohnFx ถูกต้องอย่างแน่นอน Resharper ลบออกprivate setจากคุณสมบัติบางอย่างในระหว่างการล้าง ผลลัพธ์คือ "EntityType ไม่มีข้อผิดพลาดที่กำหนดคีย์" ดังนั้นระวังของเครื่องมือการล้างข้อมูลลบรหัสที่จำเป็น
jeremysawesome

ในกรณีของฉันฉันใช้ชื่อที่ไม่เกี่ยวข้องเพื่อพูดถึง Id ของชั้นเรียน การเปลี่ยนแปลงดังกล่าวในโซลูชันของคุณสามารถแก้ไขปัญหาของฉันได้ ขอบคุณ :)
Angela Amarapala

ถ้าคุณใช้คุณสมบัติเช่นใดID, Id, ClassNameID, ClassNameIdคุณไม่จำเป็นต้องใช้[Key] attribute
Pranav Bilurkar

21

ฉันรู้ว่าโพสต์นี้จะสาย แต่วิธีนี้ช่วยฉัน:

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

เพิ่ม [คอลัมน์ (คำสั่ง = 0)] หลังจาก [คีย์] สามารถเพิ่มได้โดยการเพิ่มทีละ 1:

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

ฯลฯ ...


นี้ได้เคล็ดลับสำหรับฉัน. ฉันมี [คีย์] แล้ว แต่การเพิ่มคำสั่งแก้ไขมัน
Jaitsujin

19

ในกรณีของฉันฉันได้รับข้อผิดพลาดเมื่อสร้าง "ตัวควบคุม MVC 5 พร้อมมุมมองโดยใช้ Entity Framework"

ฉันต้องการสร้างโครงการหลังจากสร้างคลาส Model และไม่จำเป็นต้องใช้คำอธิบายประกอบ [Key]


2
ใช่ - 'ถัดไปสร้างโครงการ Web API scaffolding ใช้การสะท้อนเพื่อค้นหาคลาสโมเดลดังนั้นจึงต้องการแอสเซมบลีที่คอมไพล์แล้ว ' นำมาจากหน้านี้
อดัม

เผง งาน "สร้าง" เท่านั้นและไม่มีคำตอบก่อนหน้านี้อื่น ๆ เลย! ฉันลองหลายวิธีและในที่สุดฉันก็สร้างมันขึ้นมาและใช้งานได้! จากนั้นฉันมาที่นี่และพบคำตอบนี้ซึ่งเป็นคำตอบที่ถูกต้อง
William Hou

ยิ่งใหญ่ นี่คือกรณีของฉันหลังจากที่สร้างทั้งหมดได้รับการแก้ไข
alhpe

ใช่ .... ขอบคุณ .... แปลก ๆ นี่เป็นปัญหาในการอัพเดทใหม่ VS2019: D
JanBorup

11

การใช้ [คีย์] ไม่ได้ผลสำหรับฉัน แต่ใช้คุณสมบัติ id ทำ ฉันเพิ่งเพิ่มคุณสมบัตินี้ในชั้นเรียนของฉัน

public int id {get; set;}

1
จำเป็นต้องมี[Key]แต่คุณสมบัติที่เรียกว่า " id" จะสามารถใช้งานได้เช่นกัน
Michael Blackburn

รหัสสาธารณะสาธารณะ {รับ; ตั้ง; } หรือ [key] ^ public int Id1 {รับ; ตั้ง; }
lava

6

วัตถุจะต้องมีเขตข้อมูลที่จะใช้เป็นPrimary Keyถ้าคุณมีชื่อเขตข้อมูลIdโดยค่าเริ่มต้นนี้จะเป็นคีย์หลักของวัตถุที่เอนทิตี Framework จะเชื่อมโยงไป

มิฉะนั้นคุณควรเพิ่ม[Key]แอตทริบิวต์ด้านบนฟิลด์ที่คุณต้องการใช้เป็นPrimary Keyและคุณจะต้องเพิ่มเนมสเปซSystem.ComponentModel.DataAnnotations:

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

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


ขอบคุณ! การเพิ่ม System.ComponentModel.Annotations แพคเกจ Nuget ในโครงการทดสอบหน่วยของเราแก้ไขข้อผิดพลาดนี้ให้ฉัน ฉันโทรหา DbMigrator Update และมันล้มเหลวแม้ว่าโครงการ Domain ของเราที่มีแบบจำลองของเราและ DbContext ก็มีการอ้างอิง Nuget ทั้งสองโครงการต้องการมัน
pwhe23

4

นอกจากนี้อย่าลืมเพิ่มคำหลักสาธารณะเช่นนี้

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

คุณต้องใช้คำหลักสาธารณะเช่นนี้

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

2

สาเหตุที่เฟรมเวิร์กของ EF แจ้งให้ 'ไม่มีกุญแจ' ก็คือเฟรมเวิร์กของ EF ต้องการคีย์หลักในฐานข้อมูล หากต้องการบอก EF ว่าคุณสมบัติสำคัญคืออะไรคุณต้องเพิ่ม[Key]คำอธิบายประกอบ หรือวิธีที่เร็วที่สุดเพิ่มIDคุณสมบัติ จากนั้นเฟรมเวิร์กของ EF จะใช้IDเป็นคีย์หลักโดยค่าเริ่มต้น


จะเกิดอะไรขึ้นถ้าฐานข้อมูลมีส่วนต่อท้ายมากกว่าหนึ่งช่องที่มี ID ในการฟื้นฟูฉันสูญเสียแอตทริบิวต์ Key
Richard Griffiths

หากคุณกำลังสร้างรหัสจาก DB หนึ่งในคอลัมน์ในตารางควรเป็นคีย์หลักของตาราง
Michael Blackburn

เกี่ยวกับรหัส "แก้ไข" ที่สร้างขึ้นมันเกือบจะสร้างเป็นpartialคลาสเสมอ คุณสามารถสร้างไฟล์ที่สองเป็นpartialคลาสที่มีชื่อเดียวกันและเพิ่มคุณสมบัติอีกครั้งด้วยแอ[Key]ททริบิวต์
Michael Blackburn

1

คุณไม่จำเป็นต้องใช้คุณสมบัติคีย์ตลอดเวลา ตรวจสอบให้แน่ใจว่าไฟล์การจับคู่คีย์อย่างถูกต้อง

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

และอย่าลืมเพิ่มการแมปใน OnModelCreating ของ Repository

modelBuilder.Configurations.Add(new PacketHistoryMap());

1

สำหรับฉันแบบจำลองนั้นใช้ได้ เป็นเพราะฉันมีเฟรมเวิร์กเอนทิตีที่ต่างกัน 2 เวอร์ชั่น หนึ่งเวอร์ชันสำหรับโครงการเว็บและอีกหนึ่งเวอร์ชันสำหรับโครงการทั่วไปที่มีโมเดล

ฉันเพิ่งมีการรวมแพคเกจ nuget

ป้อนคำอธิบายรูปภาพที่นี่

สนุก!


คุณหมายถึงอะไรโดย "รวมแพคเกจ nuget"? ฉันไม่เคยได้ยินเรื่องนี้เลย ....
Rob Washington

0

ถูกต้อง แต่ในกรณีของฉันฉันมีสองคลาสเช่นนี้

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

หลังจากลบชนชั้นสูงมันใช้งานได้ดีสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.