none
Ayuda. No puedo hacer una POST: Value cannot be null. Parameter name: entity RRS feed

  • Pregunta

  • Hola, buen día.

    Estoy haciendo un WebAPI 2 con Entity Framework sobre una base de datos en SQL Server. Tengo dos tablas, una llamada Usuarios que tiene un id como llave primaria y un idTipoUsuario como llave foránea hacia la tabla TipoUsuario. 

    Tengo mi Entity Data Model generado con el asistente conectado a la base de datos así:

    public partial class Usuarios
        {
            public int idUsuario { get; set; }
            public string nombre { get; set; }
            public string apellido_p { get; set; }
            public string apellido_m { get; set; }
            public string usuario { get; set; }
            public string email { get; set; }
            public string contrasena { get; set; }
            public Nullable<System.DateTime> dia_creacion { get; set; }
            public Nullable<System.DateTime> ultima_sesion { get; set; }
            public Nullable<int> idTipoUsuario { get; set; }
        
            public virtual TipoUsuario TipoUsuario { get; set; }
        }
     public partial class TipoUsuario
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public TipoUsuario()
            {
                this.Usuarios = new HashSet<Usuarios>();
            }
        
            public int idTipoUsuario { get; set; }
            public string Tipo { get; set; }
        
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<Usuarios> Usuarios { get; set; }
        }

    En mi UsuariosController he añadido estas líneas de código:

     public class UsuariosController : ApiController
        {
            private TestUsersEntities db = new TestUsersEntities();
            //GET api/Usuarios
            public IEnumerable<Usuarios> Get() {
    
                return db.Usuarios.ToList();
            }
    
            //GET api/Usuarios?idUsuario=1
            public Usuarios Get(int idUsuario) {
                return db.Usuarios.FirstOrDefault(e => e.idUsuario == idUsuario);
            }
    
            //POST 
            public void Post([FromBody]Usuarios usuarios) {
                db.Usuarios.Add(usuarios);
                db.SaveChanges();
            }
        }

    Los GET funcionan perfectamente, pero cuando quiero hacer un POST usando Postman me lanza el error: Value cannot be null. Parameter name: entity

    En el Postman pongo el script en el apartado Test de esta manera: (y hago un POST a esta dirección: http://localhost:53799/api/Usuarios)

    {
        "nombre":"Isaias",
        "apellido_p":"Orozco",
        "apellido_m":"Toledo",
        "usuario":"isatol",
        "email": "isatol@gmail.com",
        "contrasena":"isa",
        "dia_creacion": null,
        "ultima_sesion": null,
        "idTipoUsuario": 2
    }
    


    Entonces la entidad usuarios recibe null.

    Gracias por su ayuda :)


    miércoles, 7 de febrero de 2018 23:18

Respuestas

  • Cuando te sale ese error, usualmente significa que no ha sido capaz de deserializar el objeto que pusiste en el POST y convertirlo a la clase que tienes como argumento en el controller. Entonces recibe null, y al pasar el null al Add() da ese error ("entity" se refiere a la entidad que hay que pasarle al Add).

    Sospecho que el problema podría estar en el TipoUsuario, que no se lo has pasado. Aunque es una propiedad virtual y eso lo entiende Entity Framework cuando estás grabando en base de datos, en cambio el serializador JSON no sabe nada al respecto e intenta deserializarlo como una propiedad más. Prueba a añadir "TipoUsuario":null en el JSON, a ver si así funciona.

    jueves, 8 de febrero de 2018 7:30
  • hola

    >>Los GET funcionan perfectamente, pero cuando quiero hacer un POST usando Postman me lanza el error: Value cannot be null. Parameter name: entity

    Pero si pones un breakpoint en el codigo, ingresa al Post del webapi ? porque ese error me suena a EF y no al data binding

    validaste el InnerException del error? porque este arroja mas info, por lo general indicando que propiedad no permite nulo

    quizas podrias definir un try..catch en el post para atrapar el problema y analizar mejor el mensaje

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 8 de febrero de 2018 14:10

Todas las respuestas

  • Cuando te sale ese error, usualmente significa que no ha sido capaz de deserializar el objeto que pusiste en el POST y convertirlo a la clase que tienes como argumento en el controller. Entonces recibe null, y al pasar el null al Add() da ese error ("entity" se refiere a la entidad que hay que pasarle al Add).

    Sospecho que el problema podría estar en el TipoUsuario, que no se lo has pasado. Aunque es una propiedad virtual y eso lo entiende Entity Framework cuando estás grabando en base de datos, en cambio el serializador JSON no sabe nada al respecto e intenta deserializarlo como una propiedad más. Prueba a añadir "TipoUsuario":null en el JSON, a ver si así funciona.

    jueves, 8 de febrero de 2018 7:30
  • hola

    >>Los GET funcionan perfectamente, pero cuando quiero hacer un POST usando Postman me lanza el error: Value cannot be null. Parameter name: entity

    Pero si pones un breakpoint en el codigo, ingresa al Post del webapi ? porque ese error me suena a EF y no al data binding

    validaste el InnerException del error? porque este arroja mas info, por lo general indicando que propiedad no permite nulo

    quizas podrias definir un try..catch en el post para atrapar el problema y analizar mejor el mensaje

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 8 de febrero de 2018 14:10
  • Hola Leandro.

    Si pongo un breakpoint en el Add(usuarios) aún no ingresa el Post, el Postman se queda cargando...

    Tengo un breakpoint aquí:

    db.Usuarios.Add(usuarios);

    y ahí es donde la entindad usuarios recibe null, luego la excepción con InnerException es así:

    Y en el catch me lanza esta excepción con el InnerException:

    System.NullReferenceException: 'Object reference not set to an instance of an object.'

    Message "Value cannot be null.\r\nParameter name: entity"

    ParamName "entity"

    Source "EntityFramework"



    jueves, 8 de febrero de 2018 16:02
  • Hola

    Te refieres a hacer esto?

    {
        "nombre":"Isaias",
        "apellido_p":"Orozco",
        "apellido_m":"Toledo",
        "usuario":"isatol",
        "email": "isatol@gmail.com",
        "contrasena":"isa",
        "dia_creacion": null,
        "ultima_sesion": null,
        "idTipoUsuario": 2,
        "TipoUsuario":null
    }
    No funciona así, directamente el Postman me lanza un error

    jueves, 8 de febrero de 2018 16:06
  • En la HELP de mi WebApplication el Json se tiene que hacer de esta forma:

    {
      "idUsuario": 1,
      "nombre": "sample string 2",
      "apellido_p": "sample string 3",
      "apellido_m": "sample string 4",
      "usuario": "sample string 5",
      "email": "sample string 6",
      "contrasena": "sample string 7",
      "dia_creacion": "2018-02-08T10:32:02.6034666-06:00",
      "ultima_sesion": "2018-02-08T10:32:02.6034666-06:00",
      "idTipoUsuario": 1,
      "tipoUsuario": {
        "idTipoUsuario": 1,
        "tipo": "sample string 2",
        "usuarios": []
      }
    }
    Pero lo hago así y tampoco funciona. O ¿cómo debería hacerlo? 

    jueves, 8 de febrero de 2018 16:38
  • Has puesto "tipoUsuario", pero la propiedad se llama "TipoUsuario". Recuerda que JSON es sensible a mayusculas. Prueba a ver si es por esto por lo que falla.
    jueves, 8 de febrero de 2018 17:03
  • Ok creo que andaba mal con algo. Pero lo volví a hacer y puse las propiedades en el JSON de tal forma a como están escritas en mis propiedades y quedó así:

        {
    
            "nombre": "Isaías",
            "apellido_p": "Orozco",
            "apellido_m": "Toledo",
            "usuario": "isatol",
            "email": "iot_93@hotmail.com",
            "contrasena": "isaoroto",
            "dia_creacion": null,
            "ultima_sesion": null,
            "idTipoUsuario": 1,
                    "TipoUsuario": {
                "Usuarios": [],
                "idTipoUsuario": "",
                "Tipo": ""
            }
        }

    Luego he cambiado un poco el código del controlador UsuariosController y le he puesto Routes para mejor manejo. Y le he puesto el HttpResponseMessage también:

     public HttpResponseMessage Post([FromBody]Usuarios usuarios) {
                try
                {
                    db.Usuarios.Add(usuarios);
                    db.SaveChanges();
                    var message = Request.CreateResponse(HttpStatusCode.Created, usuarios);
                    message.Headers.Location = new Uri(Request.RequestUri + usuarios.idUsuario.ToString());
                    return message;
    
                }
                catch (Exception ex) {
                    return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
                    //Console.WriteLine(ex.InnerException.Message);
                }
                
            }

    Pero aún así la entidad sigue recibiendo null y no puedo hacer POST. Y pues siempre retorna el BadRequest con el mismo error 

    jueves, 8 de febrero de 2018 20:15
  • Me di cuenta de mi error, he estado haciendo mal la petición por eso me mandaba error, pero en sí no había ya que no hacía las peticiones en el body sino directamente en el test de postman.

    Gracias a todos :D

    miércoles, 14 de febrero de 2018 21:04