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.
Тош
В моем случае я указал код на другую базу данных, а таблица отсутствовала в базе данных
Кристина Лекс,

Ответы:

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значения?
Михай Братулеску
5
Entity Framework не поддерживает целые числа без знака msdn.microsoft.com/en-us/library/vstudio/...
user2316116
1
И если вы используете его в качестве модели в MVC, не забудьте восстановить!
RoJaIt
1
Многие разные вещи могут вызвать эту ошибку. В моем случае я ошибочно пометил свое поле «Id» «private» вместо «public» (привычка Java / JPA). Ответ Ларри Рэймонда, приведенный ниже, возможно, является «лучшим» ответом на этот вопрос. В нем перечислены большинство распространенных сценариев «EntityType не имеет ошибки, определенной ключом».
paulsm4
98
  1. Убедитесь, что общедоступные члены класса ученика определены как свойства w / {get; set;}(у вас публичные переменные - распространенная ошибка).

  2. Поместите [Key]аннотацию поверх выбранной вами недвижимости.

Ларри Рэймонд
источник
Это была моя проблема. Спасибо. Я реализовывал интерфейс, который требует только геттер для ID
Генри Инг-Симмонс
81

Это может произойти по нескольким причинам. Некоторые из них я нашел здесь , другие я обнаружил самостоятельно.

  • Если свойство имеет имя, отличное от Id, вам необходимо добавить [Key]к нему атрибут.
  • Ключ должен быть свойством, а не полем.
  • Ключ должен быть public
  • Ключ должен быть CLS-совместимым типом, что означает, что неподписанные типы, такие как uintи ulongт. Д., Не допускаются.
  • Эта ошибка также может быть вызвана ошибками конфигурации .
BlueRaja - Дэнни Пфлугхофт
источник
3
Я также обнаружил, что ключевое свойство должно быть доступно для чтения и записи. Я получил ошибку OP, когда у меня был метод get, а в свойстве ID отсутствовал метод установки.
JohnFx
1
@JohnFx абсолютно правильно. Resharper удален private setиз некоторых свойств во время очистки. Результатом было "EntityType не имеет определенной ключом ошибки". Так что остерегайтесь инструментов очистки, удаляющих необходимый код.
Jeremysawesome
В моем случае я использовал какое-то несвязанное имя, чтобы упомянуть идентификатор класса. Изменение, как указано в вашем решении, решило мою проблему. Спасибо :)
Анжела Амарапала
Если вы используете какое - либо имущество , как 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; }

и т.д...

danigitman
источник
Это помогло мне. У меня уже был [Ключ], но добавление заказа решило его.
Jaitsujin
19

В моем случае я получал ошибку при создании «Контроллер MVC 5 с представлением, используя Entity Framework».

Мне просто нужно было создать проект после создания класса Model, и мне не нужно было использовать аннотацию [Key].

Chriss
источник
2
Да - «Далее, создайте проект. В скаффолдинге Web API используется отражение, чтобы найти классы модели, поэтому ему нужна скомпилированная сборка. ' взято с этой страницы
Адам
Именно. Работает только «build», и ни один из предыдущих ответов не работает! Я попробовал довольно много способов, и наконец я построил это, и это сработало! Тогда я пришел сюда и нашел этот ответ, который является правильным ответом.
Уильям Хоу
здорово. это был мой случай, после сборки все решается
alhpe
Да .... СПАСИБО .... Странно, это проблема в новом обновленном VS2019: D
JanBorup
11

Использование [ключа] не работает для меня, но использование свойства id делает это. Я просто добавляю это свойство в мой класс.

public int id {get; set;}
Уильям Белло
источник
1
Это должно быть [Key], но свойство, называемое " id", также будет работать.
Майкл Блэкберн
public int Id {get; устанавливать; } или [ключ] ^ 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

Майер Спитцер
источник
Спасибо! Добавление пакета Nuget System.ComponentModel.Annotations в наш проект модульных тестов исправило эту ошибку для меня. Я звонил в DbMigrator Update, и он не удался, хотя наш проект Domain с нашими моделями и DbContext имел ссылку на Nuget. Оба проекта нуждаются в этом.
pwhe23
4

Кроме того, помните, не забудьте добавить общедоступное ключевое слово, как это

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

Вы должны использовать ключевое слово Public, как это

[Key] 
public int RoleId { get; set; } //correct method
Удара Касун
источник
2

Причина, по которой EF Framework запрашивает «нет ключа», заключается в том, что EF Framework нуждается в первичном ключе в базе данных. Чтобы декларативно сообщить EF, какое свойство является ключом, вы добавляете [Key]аннотацию. Или, самый быстрый способ, добавить IDсвойство. Затем EF-фреймворк IDпо умолчанию будет использоваться в качестве первичного ключа.

UtillYou
источник
Что произойдет, если в базе данных есть несколько полей с суффиксом ID? При регенерации я теряю атрибут Key.
Ричард Гриффитс
Если вы генерируете код из БД, один из столбцов в таблице должен быть основным ключом таблицы.
Майкл Блэкберн
Что касается «редактирования» сгенерированного кода, он почти всегда генерируется как partialкласс. Вы можете создать второй файл как partialкласс с тем же именем и снова добавить свойство с [Key]атрибутом.
Майкл Блэкберн
1

Вам не нужно все время использовать ключевой атрибут. Убедитесь, что в файле сопоставления правильно указан ключ

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

и не забудьте добавить отображение в OnModelCreating репозитория

modelBuilder.Configurations.Add(new PacketHistoryMap());
вздор
источник
1

Для меня модель была в порядке. Это было потому, что у меня было 2 разные версии структуры сущностей. Одна версия для веб-проекта и другая для общего проекта, который содержит модели.

Мне просто нужно было объединить пакеты nuget .

введите описание изображения здесь

Наслаждайтесь!

Даниил
источник
Что вы подразумеваете под «объединением пакетов nuget»? Я никогда не слышал об этом ....
Роб Вашингтон
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; }
}
        }
    }

После удаления высшего класса у меня все работает нормально.

Дебендра Дэш
источник