EntityType không có lỗi được xác định chính


145

Điều khiển:

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

    }
}

Mô hình DbContext:

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

Mô hình:

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

Bảng cơ sở dữ liệu:

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

Trong global.asax.cs

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

Đoạn mã trên liệt kê tất cả các lớp tôi đang làm việc. Khi chạy ứng dụng của tôi, tôi nhận được lỗi:

"Một hoặc nhiều lỗi xác thực được phát hiện trong quá trình tạo mô hình" cùng với "Loại thực thể không có khóa được xác định".


3
Kiểm tra tệp lưu trữ. Tất cả các giải pháp trong trang này đều tuyệt vời nhưng trong trường hợp của tôi, tôi đã làm mọi thứ đúng nhưng quên khai báo bảng là DbSet và thêm nó vào modelbuilder.configurations.
Tosh

Trong trường hợp của tôi, tôi đã chỉ mã cho một db khác và bảng bị thiếu từ db
Kristina Lex

Câu trả lời:


168

Lớp Model nên được thay đổi thành:

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
mã của tôi hoạt động (không có [Key]) cho đến khi tôi thay đổi kiểu dữ liệu (tôi đã thay đổi chúng thành unsigned) và chỉ có byte hoạt động là có lý do tôi không thể sử dụng unsignedcác giá trị?
Mihai Bratulescu

5
Entity Framework không hỗ trợ các số nguyên không dấu msdn.microsoft.com/en-us/l
Library / vudio / Lỗi

1
Và trong trường hợp bạn đang sử dụng nó như một mô hình trong MVC, đừng quên xây dựng lại!
RoJaIt

1
Rất nhiều điều khác nhau có thể gây ra lỗi này. Trong trường hợp của tôi, tôi đã đánh dấu nhầm trường "Id" của mình là "riêng tư" thay vì "công khai" (một thói quen từ Java / JPA). Câu trả lời của Larry Raymond dưới đây được cho là câu trả lời "tốt nhất" cho câu hỏi này. Nó liệt kê hầu hết các kịch bản phổ biến đằng sau "EntityType không có lỗi được xác định chính".
paulsm4

98
  1. Đảm bảo các thành viên công khai của lớp sinh viên được xác định là thuộc tính w / {get; set;}(của bạn là các biến công khai - một lỗi phổ biến).

  2. Đặt một [Key]chú thích trên đầu trang của tài sản bạn đã chọn.


Đây là vấn đề của tôi. Cảm ơn. Tôi đã triển khai một giao diện chỉ yêu cầu một getter cho ID
Henry Ing-Simmons

81

Có một số lý do điều này có thể xảy ra. Một số trong số này tôi tìm thấy ở đây , một số khác tôi tự khám phá.

  • Nếu thuộc tính được đặt tên khác Id, bạn cần thêm [Key]thuộc tính cho nó.
  • Chìa khóa cần phải là một tài sản, không phải là một lĩnh vực.
  • Chìa khóa cần phải là public
  • Khóa cần phải là loại tuân thủ CLS, nghĩa là các loại không dấu như uint, ulongv.v. không được phép.
  • Lỗi này cũng có thể được gây ra bởi lỗi cấu hình .

3
Tôi cũng đã thấy rằng thuộc tính quan trọng phải được đọc-ghi. Tôi đã gặp lỗi của OP khi tôi có một getter và không có setter trên thuộc tính ID.
JohnFx

1
@JohnFx hoàn toàn chính xác. Resharper loại bỏ private setkhỏi một số tài sản trong khi dọn dẹp. Kết quả là "EntityType không có lỗi được xác định chính". Vì vậy, hãy cẩn thận với các công cụ dọn dẹp loại bỏ mã cần thiết.
jeremysawgie

Trong trường hợp của tôi, tôi đã sử dụng một số tên không liên quan để đề cập đến Id của lớp. Thay đổi điều đó như được đề cập trong giải pháp của bạn đã giải quyết vấn đề của tôi. Thankyou :)
Angela Amarapala

Nếu bạn sử dụng bất cứ tài sản như ID, Id, ClassNameID, ClassNameIdbạn không cần phải sử dụng[Key] attribute
Pranav Bilurkar

21

Tôi biết rằng bài đăng này là muộn nhưng giải pháp này đã giúp tôi:

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

đã thêm [Cột (Thứ tự = 0)] sau khi [Khóa] có thể được thêm theo mức tăng thêm 1:

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

Vân vân...


Điều này đã lừa tôi. Tôi đã có [Key] rồi nhưng việc thêm đơn hàng đã giải quyết nó.
Jaitsujin

19

Trong trường hợp của tôi, tôi đã gặp lỗi khi tạo "Bộ điều khiển MVC 5 có chế độ xem, sử dụng Entity Framework".

Tôi chỉ cần Xây dựng dự án sau khi tạo lớp Model và không cần sử dụng chú thích [Khóa].


2
Có - 'Tiếp theo, xây dựng dự án. Giàn giáo API Web sử dụng sự phản chiếu để tìm các lớp mô hình, do đó, nó cần lắp ráp được biên dịch. ' lấy từ trang này
Adam

Chính xác. Chỉ "xây dựng" hoạt động, và không có câu trả lời nào trước đó làm được! Tôi đã thử khá nhiều cách và cuối cùng tôi đã xây dựng nó và nó đã hoạt động! Sau đó tôi đến đây và tìm thấy câu trả lời này, đó là câu trả lời đúng.
William Hou

tuyệt quá. đây là trường hợp của tôi, sau khi xây dựng xong tất cả được giải quyết
alhpe

Có .... CẢM ƠN .... Điều kỳ lạ là đây là một vấn đề trong bản cập nhật mới VS2019: D
JanBorup

11

Sử dụng [khóa] không hiệu quả với tôi nhưng sử dụng thuộc tính id sẽ làm được điều đó. Tôi chỉ cần thêm tài sản này trong lớp học của tôi.

public int id {get; set;}

1
Nó cần phải có [Key], nhưng một tài sản được gọi là " id" cũng sẽ hoạt động.
Michael Blackburn

công khai int Id {get; bộ; } hoặc [key] ^ public int Id1 {get; bộ; }
dung nham

6

Đối tượng phải chứa một trường sẽ được sử dụng làm trường Primary Key, nếu bạn có một trường được đặt tên Idthì theo mặc định, đây sẽ là khóa chính của đối tượng mà Entity Framework sẽ liên kết đến.

Mặt khác, bạn nên thêm [Key]thuộc tính phía trên trường mà bạn muốn sử dụng làm Primary Keyvà bạn cũng cần thêm không gian tên System.ComponentModel.DataAnnotations:

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

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


Cảm ơn! Việc thêm gói System.ComponentModel.Annotations Nuget vào dự án Kiểm tra đơn vị của chúng tôi đã sửa lỗi này cho tôi. Tôi đã gọi DbMigrator Update và nó đã thất bại mặc dù dự án Miền của chúng tôi với các mô hình và DbContext có tham chiếu Nuget. Cả hai dự án đều cần nó.
pwhe23

4

Ngoài ra, hãy nhớ, đừng quên thêm từ khóa công khai như thế này

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

bạn phải sử dụng từ khóa công khai như thế này

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

2

Lý do tại sao nhắc nhở khung công tác EF 'không có khóa' là vì khung công tác EF cần một khóa chính trong cơ sở dữ liệu. Để khai báo cho EF biết thuộc tính nào là khóa, bạn thêm một [Key]chú thích. Hoặc, cách nhanh nhất, thêm một IDtài sản. Sau đó, khung làm việc EF sẽ lấy IDlàm khóa chính theo mặc định.


Điều gì xảy ra nếu cơ sở dữ liệu có nhiều hơn một trường có ID? Khi tái sinh tôi mất thuộc tính Key.
Richard Griffiths

Nếu bạn đang tạo mã từ DB, một trong các cột trong bảng sẽ là Khóa chính của bảng.
Michael Blackburn

Về "chỉnh sửa" mã được tạo, nó hầu như luôn được tạo như một partiallớp. Bạn có thể tạo tệp thứ hai dưới dạng một partiallớp có cùng tên và thêm thuộc tính một lần nữa với [Key]thuộc tính.
Michael Blackburn

1

Bạn không cần phải sử dụng thuộc tính khóa mọi lúc. Đảm bảo tệp ánh xạ được xử lý đúng cách

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

và đừng quên thêm ánh xạ vào OnModelCreating của Kho lưu trữ

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

1

Đối với tôi, mô hình là tốt. Đó là bởi vì tôi có 2 phiên bản khác nhau của khung thực thể. Một phiên bản cho dự án web và một phiên bản khác cho dự án chung có chứa các mô hình.

Tôi chỉ phải hợp nhất các gói nuget .

nhập mô tả hình ảnh ở đây

Thưởng thức!


Bạn có ý nghĩa gì khi "hợp nhất các gói nuget"? Tôi chưa bao giờ nghe về điều này ....
Rob Washington

0

Tất cả đều đúng nhưng trong trường hợp của tôi, tôi có hai lớp như thế này

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

Sau khi xóa lớp trên nó hoạt động tốt cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.