EntityType не имеет ключевой ошибки
Контроллер:
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);
В приведенном выше коде перечислены все классы, над которыми я работаю. При запуске приложения я получаю сообщение об ошибке:
"Во время генерации модели были обнаружены одна или несколько ошибок проверки", а также "Тип сущности не имеет ключа".
Ответы
Ответ 1
Класс 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; }
}
}
Ответ 2
-
Убедитесь, что общедоступные члены класса ученика определены как свойства w/ {get; set;}
(ваши общедоступные переменные - распространенная ошибка).
-
Поместите аннотацию [Key]
поверх выбранного вами свойства.
Ответ 3
Это может быть несколько причин. Некоторые из них я нашел здесь, другие, которые я обнаружил сам по себе.
- Если свойство имеет имя, отличное от
Id
, вам нужно добавить к нему атрибут [Key]
.
- Ключ должен быть свойством, а не полем.
- Ключ должен быть
public
- Ключ должен быть CLS-совместимым типом, что означает, что беззнаковые типы, такие как
uint
, ulong
и т.д., не допускаются.
- Эта ошибка также может быть вызвана ошибками конфигурации .
Ответ 4
Я знаю, что этот пост опаздывает, но
это решение помогло мне:
[Key]
[Column(Order = 0)]
public int RoleId { get; set; }
добавлено [Столбец (Заказ = 0)]
после [Key]
может быть добавлено путем увеличения на 1:
[Key]
[Column(Order = 1)]
public int RoleIdName { get; set; }
и т.д...
Ответ 5
В моем случае я получал ошибку при создании "MVC 5 Controller с представлением, используя Entity Framework".
Мне просто нужно было создать проект после создания класса Model и не нужно было использовать аннотацию [Key].
Ответ 6
Использование [key] не работает для меня, но использует свойство id.
Я просто добавляю это свойство в свой класс.
public int id {get; set}
Ответ 7
Причина, по которой EF-инфраструктура запрашивает "нет ключа", заключается в том, что для структуры EF необходим первичный ключ в базе данных. Чтобы декларативно сказать EF, какое свойство принадлежит ключу, вы добавляете аннотацию [Key]
. Или, самый быстрый способ, добавьте свойство ID
. Затем структура EF по умолчанию примет ID
как первичный ключ.
Ответ 8
Все правильно, но в моем случае у меня есть два класса, таких как
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; }
}
}
}
После удаления верхнего класса он отлично работает для меня.