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 모델 :

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

제 경우에는 코드를 다른 db로 가리키고 테이블이 db에서 누락되었습니다.
— 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값을 사용할 수없는 이유가 있습니까?
— Mihai Bratulescu

5
Entity Framework는 부호없는 정수를 지원하지 않습니다. msdn.microsoft.com/en-us/library/vstudio/…
— user2316116

1
MVC에서 모델로 사용하는 경우 다시 작성하는 것을 잊지 마십시오!
— RoJaIt

1
다른 많은 것들이이 오류를 일으킬 수 있습니다. 제 경우에는 실수로 "public"대신 "Id"필드를 "private"(Java / JPA의 습관)으로 표시했습니다. 아래 의 Larry Raymond의 답변 은이 질문에 대한 "최상의"답변 일 것입니다. "EntityType에 키 정의 오류가 없습니다"뒤에 나오는 대부분의 일반적인 시나리오가 나와 있습니다.
— paulsm4 '14

98
  1. 학생 클래스의 확인 공용 멤버로 정의되어 있는지 확인 속성 W / {get; set;}(당신은 공개되어 변수 - 일반적인 실수를).

  2. 장소 [Key]선택한 재산의 상단에 주석을.


이것은 내 문제였다. 감사. 난 단지 ID에 대한 게터을 필요로하는 인터페이스를 구현 한
— 헨리 잉 - 시몬스

81

이 문제가 발생할 수있는 몇 가지 이유가 있습니다. 내가 여기서 찾은 것들 중 일부는 내가 스스로 발견했다.

  • 속성 이름이 이외의 다른 속성 인 경우 속성 Id을 추가해야 [Key]합니다.
  • 키는 필드가 아닌 속성이어야합니다.
  • 열쇠는 public
  • 핵심 요구 사항은 서명되지 않은 유형이 같은 의미하는 CLS 규격 유형으로 uint, ulong허용되지 않습니다 등.
  • 이 오류는 구성 실수 로 인해 발생할 수도 있습니다 .

3
또한 키 속성이 읽기-쓰기 여야한다는 것을 알았습니다. ID 속성에 getter가 있고 setter가 없을 때 OP의 오류가 발생했습니다.
— JohnFx

1
@JohnFx는 절대적으로 정확합니다. private set정리하는 동안 일부 속성에서 Resharper가 제거되었습니다 . 결과는 "EntityType에 키 정의 오류가 없습니다"입니다. 따라서 필요한 코드를 제거하는 정리 도구에주의하십시오.
— jeremysawesome

제 경우에는 관련없는 이름을 사용하여 수업의 ID를 언급했습니다. 귀하의 솔루션에 언급 된대로 변경하면 내 문제가 해결되었습니다. 감사합니다 :)
— Angela Amarapala

당신이 좋아하는 어떤 속성을 사용하는 경우 ID, Id, ClassNameID, ClassNameId당신은 사용할 필요가 없습니다 필요[Key] attribute
— PRANAV Bilurkar

21

이 게시물이 늦었지만이 솔루션이 도움이되었다는 것을 알고 있습니다.

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

[Key] 이후에 [Column (Order = 0)]을 1 씩 추가하여 추가 할 수 있음

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

기타...


이것은 나를 위해 속임수를했다. 이미 [Key]를 가지고 있었지만 주문을 추가하면 해결되었습니다.
— Jaitsujin

19

필자의 경우 "Entity Framework를 사용하여보기가있는 MVC 5 컨트롤러"를 만들 때 오류가 발생했습니다.

Model 클래스를 만든 후 프로젝트를 빌드해야했고 [Key] 주석을 사용할 필요가 없었습니다.


2
예- '다음으로 프로젝트를 빌드하십시오. 웹 API 스캐 폴딩은 리플렉션을 사용하여 모델 클래스를 찾기 때문에 컴파일 된 어셈블리가 필요합니다. ' 이 페이지
— Adam

바로 그거죠. "빌드"만 작동하고 다른 이전 답변은 작동하지 않습니다! 나는 많은 방법을 시도했고 마침내 그것을 만들었고 효과가있었습니다! 그런 다음 여기에 와서이 답변을 찾았습니다. 정답입니다.
— William Hou

큰. 빌드가 모두 해결 된 후 이것은 나의 경우였다
— alhpe

예 .... 감사합니다 .... 이상한 이것은 새로 업데이트 된 VS2019 : D
— JanBorup

11

[key]를 사용하면 효과가 없었지만 id 속성을 사용하면 효과가 있습니다. 이 클래스를 클래스에 추가하면됩니다.

public int id {get; set;}

1
이어야 [Key]하지만 " id" 라는 속성 도 작동합니다.
— Michael Blackburn

public int Id {get; 세트; } 또는 [key] ^ public int Id1 {get; 세트; }
— 용암

6

객체는로 사용되는 필드를 포함해야합니다. Primary Key이름 Id이 지정된 필드가 있으면 기본적으로 Entity 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


감사! Unit.Tests 프로젝트에 System.ComponentModel.Annotations Nuget 패키지를 추가하면이 오류가 해결되었습니다. DbMigrator 업데이트를 호출하고 모델과 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에 매핑을 추가하는 것을 잊지 마십시오

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

1

나를 위해, 모델은 괜찮 았습니다. 엔터티 프레임 워크의 두 가지 버전 이 있었기 때문 입니다. 웹 프로젝트 용 버전과 모델이 포함 된 일반 프로젝트 용 버전.

난 그냥 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.