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

    }
}

DbContext Modelo:

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 el mundial.asax.cs

Database.SetInitializer<MvcApplication1.Models.studentContext>(null);

El código anterior muestra todas las clases que estoy trabajando. Al momento de ejecutar mi aplicación estoy recibiendo el error:

«Uno o más errores de validación fueron detectados durante la generación de modelos», junto con «tipo de Entidad no tiene clave definido».

  • Compruebe el archivo del repositorio. Todas las soluciones en esta página son increíbles, pero en mi caso, hice todo bien pero se me olvidó declarar la tabla como DbSet y agregar a la modelbuilder.las configuraciones.
  • En mi caso, me señaló con el código a otra db y la mesa había desaparecido de db
InformationsquelleAutor Coder | 2013-11-25

12 Comentarios

  1. 158

    El Modelo de la clase debe ser cambiado 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; }
        }
    }
    • mi código de trabajo (sin [Key]) hasta puedo cambiar los tipos de datos (he cambiado a unsigned) y sólo byte obras hay una razón que no puedo usar unsigned valores?
    • Entity Framework no admite enteros sin signo msdn.microsoft.com/en-us/library/vstudio/…
    • Y en caso de que usted lo está utilizando como un modelo MVC, no te olvides de reconstrucción!
    • Un montón de cosas diferentes que pueden causar este error. En mi caso, yo erróneamente marcado mi campo «Id» de «privado» en lugar de «lo público» (un hábito de Java/JPA). Larry Raymond de la respuesta por debajo de la que podría decirse que es la «mejor» respuesta a esta pregunta. Se enumera la mayoría de los escenarios más comunes detrás de «EntityType no tiene clave de error definido».
  2. 92
    1. Asegúrese de miembros públicos de la clase estudiante se define como propiedades w/{get; set;} (el tuyo son públicos variables – un error común).

    2. Lugar un [Key] anotación en la parte superior de su propiedad elegida.

    • Este era mi problema. Gracias. Yo estaba implementando una interfaz que sólo requiere un getter para la IDENTIFICACIÓN de la
    • yo no la establece; la propiedad, gracias
  3. 79

    Hay varias razones por las que esto puede suceder. Algunos de estos he encontrado aquí, otros descubrí por mi cuenta.

    • Si la propiedad es un nombre distinto de Id, usted necesita agregar el [Key] atribuyen a él.
    • La clave debe ser una propiedad, no es un campo.
    • La clave debe ser public
    • La clave debe ser compatible con CLS tipo, lo que significa unsigned tipos como uint, ulong etc. no están permitidos.
    • Este error también puede ser causada por errores de configuración.
    • También he encontrado que la clave de la propiedad tiene que ser de lectura-escritura. Tengo OP error cuando tuve un getter y no setter de la propiedad ID.
    • es absolutamente correcto. Resharper eliminado private set de algunas de las propiedades durante la limpieza. El resultado fue el «EntityType no tiene clave de error definido». Así que ten cuidado de la limpieza de las herramientas de extracción de código necesario.
    • En mi caso, he utilizado algunas no relacionadas nombre de mencionar el Identificador de la clase. Cambio que, como se menciona en la solución resuelto mi problema. Gracias 🙂
    • Si utiliza cualquier propiedad como ID , Id , ClassNameID, ClassNameId que no tienen necesidad de utilizar [Key] attribute
  4. 19

    sé que este post es tarde pero
    esta solución me ayudó:

        [Key]
        [Column(Order = 0)]
        public int RoleId { get; set; }

    añadido [Columna(Orden = 0)]
    después de la [Tecla]
    puede ser añadido por el incremento de 1:

        [Key]
        [Column(Order = 1)]
        public int RoleIdName { get; set; }

    etc…

  5. 16

    En mi caso, yo estaba recibiendo el error a la hora de crear un «MVC 5 Controlador de vista, el uso de Entity Framework».

    Sólo necesitaba para Construir el proyecto después de crear el Modelo de la clase y no necesita usar la Tecla [] anotación.

    • Sí sí – sí ‘a continuación, generar el proyecto. La Web de la API de andamios utiliza la reflexión para encontrar el modelo de clases, por lo que necesita el ensamblado compilado.’ tomado de esta página
    • Exactamente. Sólo «construir» obras, y ninguna de las otras respuestas anteriores no! He intentado de muchas maneras y, finalmente, he construido y trabajado! Luego vine aquí y encontré esta respuesta, que es la respuesta correcta.
    • gran. este fue mi caso, después de construir todo se solucionó
  6. 9

    Utilizando la tecla [] no trabajo para mí, pero el uso de un id de propiedad lo hace.
    Acabo de añadir esta propiedad en mi clase.

    public int id {get; set;}
    • Debe ser [Key], pero una propiedad llamada «id» también funcionará.
  7. 3

    El objeto debe contener un campo que será utilizado como el Primary Key, si usted tiene un campo denominado Id entonces esto va por defecto será la clave primaria del objeto a que Entity Framework será un enlace.

    De lo contrario, se debe agregar el [Key] atributo por encima de ese campo que usted quiere utilizar como el Primary Key, y usted también tendrá que agregar el espacio de nombres System.ComponentModel.DataAnnotations:

    public class myClass
    {
        public int Id { get; set; }
        [Key]
        public string Name { get; set; }
    }

    https://stackoverflow.com/a/51180941/7003760

  8. 2

    La razón por la EF marco símbolo del sistema ‘llave’ es que EF marco de las necesidades de una clave principal en la base de datos. De forma declarativa decir EF de la propiedad que la clave está en añadir un [Key] anotación. O, la forma más rápida, añadir un ID de la propiedad. A continuación, el EF marco se llevará a ID como la clave principal de forma predeterminada.

    • ¿Qué sucede si la base de datos tiene más de un campo con el sufijo ID? En la regeneración se me pierde el atributo Clave.
    • Si estás generando el código de la base de datos, una de las columnas de la tabla debe ser la Clave principal de la tabla.
    • Con respecto a la «edición» código generado, casi siempre se genera como un partial clase. Usted puede crear un segundo archivo como un partial clase con el mismo nombre, y agregar la propiedad de nuevo con el [Key] atributo.
  9. 2

    Además Recuerda, No te olvides de añadir público palabra clave como este

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

    debe utilizar la palabra clave Public como este

    [Key] 
    public int RoleId { get; set; } //correct method
  10. 1

    Usted no tiene que utilizar la tecla atributo todo el tiempo. Asegúrese de que el archivo de asignación abordado de manera adecuada la clave

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

    y no te olvides de agregar la asignación en el Repositorio del OnModelCreating

    modelBuilder.Configurations.Add(new PacketHistoryMap());
  11. 1

    Para mí, el modelo estaba bien. Era porque me había 2 diferentes versiones de entity framework. Una versión para el proyecto web y otro para el proyecto común que contiene los modelos.

    Yo sólo tenía que consolidar los paquetes de nuget.

    EntityType no tiene clave de error definido por el

    Disfrutar!

    • ¿Qué entiende usted por «consolidar los paquetes de nuget»? Nunca he oído hablar de esto….
    • He editado la respuesta de modo que usted puede ver.
  12. 0

    Todo está bien, pero en mi caso tengo dos clase 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 la eliminación de la clase alta, funciona muy bien para mí.

Dejar respuesta

Please enter your comment!
Please enter your name here