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.
Тош

У моєму випадку я вказав код на інший db, а таблиця відсутня в db
Крістіна Лекс

Відповіді:


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" "приватним" замість "загальнодоступним" (звичка від Java / JPA). Ларрі Реймонда відповідь нижче, ймовірно, «кращий» відповідь на це питання. У ньому перераховано більшість поширених сценаріїв "EntityType не має помилки, визначеної ключем".
paulsm4

98
  1. Переконайтесь, що громадські члени класу учнів визначені як властивості w / {get; set;}(ваші загальнодоступні змінні - поширена помилка).

  2. Помістіть [Key]примітку поверх обраного ресурсу.


Це була моя проблема. Дякую. Я реалізовував інтерфейс, для якого потрібен лише геттер для ID
Генрі Інг-Сіммонс

81

Причин цього може бути кілька. Деякі з них я знайшов тут , інші я виявив самостійно.

  • Якщо властивість названо чимось іншим Id, вам потрібно додати [Key]атрибут до нього.
  • Ключовим має бути властивість, а не поле.
  • Ключ повинен бути public
  • Основні потреби бути CLS-сумісний тип, тобто беззнакових типів подобається uint, і ulongт.д., не допускається.
  • Ця помилка також може бути викликана помилками конфігурації .

3
Я також виявив, що ключову властивість треба читати-записувати. Я отримав помилку OP, коли у мене був власник ідентифікатора і не встановлений.
JohnFx

1
@JohnFx абсолютно коректний. Resharper видалено private setз деяких властивостей під час очищення. Результатом було те, що "EntityType не має помилки, визначеної ключем". Тож остерігайтеся інструментів очищення, видаляючи необхідний код.
jeremysawesome

У моєму випадку я використовував якесь незв'язане ім'я, щоб згадати Id класу. Змінення цього, як було сказано у вашому рішенні, вирішило мою проблему.
Дякую

Якщо ви використовуєте будь - яке майно , як 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
Так - 'Далі, будуйте проект. Ліси веб-API використовує відображення для пошуку класів моделей, тому для цього потрібна складена збірка. ' взято з цієї сторінки
Адам,

Саме так. Тільки "будувати" працює, і жодна з інших попередніх відповідей не робить! Я спробував досить багато способів і, нарешті, побудував це, і воно спрацювало! Потім я прийшов сюди і знайшов цю відповідь, яка є правильною відповіддю.
Вільям Хоу

чудовий. це був мій випадок, після побудови все вирішується
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


Дякую! Додавання пакета System.ComponentModel.Annotations до нашого проекту Тести модулів виправило цю помилку для мене. Я закликав оновлення 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властивість. Потім IDза замовчуванням основний ключ буде взято як основу EF .


Що станеться, якщо в базі даних є більше одного поля з суфіксом ідентифікатора? Після регенерації я втрачаю атрибут 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 різні версії суттнього фреймворку. Одна версія для веб-проекту та ще одна для спільного проекту, що містить моделі.

Мені просто довелося консолідувати пакети нугів .

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

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


Що ви маєте на увазі під "консолідацією пакетів нута"? Я ніколи не чув про це ....
Роб Вашингтон,

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

Після вилучення вищого класу для мене це прекрасно працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.