c# - tutorial - que es code first entity framework
EntityType no tiene un error definido por la clave (8)
Asegúrese de que los miembros públicos de la clase de los estudiantes se definan como propiedades w /
{get; set;}
{get; set;}
(las tuyas son variables públicas, un error común).Coloque una anotación
[Key]
encima de su propiedad elegida.
Controlador:
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);
}
}
}
Modelo 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; }
}
}
Modelo:
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;
}
}
Tabla de base de datos:
CREATE TABLE [dbo].[studentdetails](
[RollNo] [int] NULL,
[Name] [nvarchar](50) NULL,
[Stream] [nvarchar](50) NULL,
[Div] [nvarchar](50) NULL
)
En global.asax.cs
Database.SetInitializer<MvcApplication1.Models.studentContext>(null);
El código anterior enumera todas las clases en las que estoy trabajando. Al ejecutar mi aplicación estoy recibiendo el error:
"Uno o más errores de validación se detectaron durante la generación del modelo" junto con "El tipo de entidad no tiene una clave definida".
En mi caso, recibí el error al crear un "Controlador MVC 5 con vista, utilizando Entity Framework".
Solo necesitaba construir el proyecto después de crear la clase Model y no necesitaba usar la anotación [Key].
Hay varias razones por las que esto puede suceder. Algunos de estos encontré here , otros descubrí por mi cuenta.
- Si la propiedad tiene otro nombre que no sea
Id
, debe agregarle el atributo[Key]
. - La clave debe ser una propiedad, no un campo.
- La clave debe ser
public
- La clave debe ser un tipo compatible con CLS, lo que significa que los tipos sin firmar como
uint
,ulong
, etc. no están permitidos. - Este error también puede ser causado por errores de configuración .
La clase Model debe cambiarse a:
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; }
}
}
La razón por la cual EF Framework ''no key'' es que EF framework necesita una clave primaria en la base de datos. Para declarar declarativamente a EF qué propiedad es la clave, agrega una anotación [Key]
. O, de la manera más rápida, agregue una propiedad de ID
. Entonces, el marco EF tomará ID
como la clave primaria por defecto.
Sé que esta publicación es tardía pero esta solución me ayudó:
[Key]
[Column(Order = 0)]
public int RoleId { get; set; }
se agregó [Columna (Pedido = 0)] después de que se pueda agregar [Clave] por incremento en 1:
[Key]
[Column(Order = 1)]
public int RoleIdName { get; set; }
etc ...
Todo está bien pero en mi caso tengo dos clases como esta
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; }
}
}
}
Después de eliminar la clase superior, funciona bien para mí.
Usar la [tecla] no funcionó para mí, pero usar una propiedad de identificación lo hace. Solo agrego esta propiedad en mi clase.
public int id {get; set}