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.