none
Error con propiedad en Entity Framework Core RRS feed

  • Pregunta

  • Hola desarrolladores, soy nuevo en entity framework y tengo la siguiente duda, espero me puedan guiar.

    Tengo una entidad asi

    public class Equipo
        {
            public int Id { get; set; }
            public string Serial { get; set; }
            public string Descripcion { get; set; }
            public int IdTipoEquipo { get; set; }
            public int IdMarca { get; set; }
            public int IdRango { get; set; }
            public int IdResponsable { get; set; }
            public decimal PeriodoCalibracion { get; set; }
            public decimal Clase { get; set; }
            public string Patron { get; set; }
            public string ActivoFijo { get; set; }
            public string IdArticulo { get; set; }
            public int IdEstado { get; set; }
            public string UsuarioRegistro { get; set; }
            public DateTime FechaRegistro { get; set; } = DateTime.Now;
            public string UsuarioActualiza { get; set; }
            public DateTime FechaActualiza { get; set; } = DateTime.Now;
            public List<EquipoDetalle> Detalle { get; set; }
        }
    Como ven dentro de esa entidad va otra llamada detalle que es esta.
    
    public class EquipoDetalle
        {
            public int Id { get; set; }
            [Column("IdEquipo")]
            public int EquipoId { get; set; }
            public DateTime Fecha { get; set; }
            public int IdLaboratorio { get; set; }
            public string Certificado { get; set; }
            public string Observacion { get; set; }
            public DateTime? ProxVerificacion { get; set; }
            public int IdMovimiento { get; set; }
            // public byte[] Imagen { get; set; }
            public int? IdCalibracion { get; set; }
            public int IdResponsable { get; set; }
            public int IdEstado { get; set; }
            public string UsuarioRegistro { get; set; }
            public DateTime FechaRegistro { get; set; } = DateTime.Now;
            public string UsuarioActualiza { get; set; }
            public DateTime FechaActualiza { get; set; } = DateTime.Now;
            public Programacion Programacion { get; set; }
        }
    Y el detalle lleva dentro otra llamada programación que es esta.
    
    public class Programacion
        {
            public int Id { get; set; }
            public string IdEmpleado { get; set; }
            public DateTime Fecha { get; set; }
            public int IdEquipoDetalle { get; set; }
            public int IdEstado { get; set; }
            public string UsuarioRegistro { get; set; }
            public DateTime FechaRegistro { get; set; }
            public string UsuarioActualiza { get; set; }
            public DateTime FechaActualiza { get; set; }
        }


    El lio que tengo es que la entidad 1 y su detalle (la entidad2) vienen llenas, pues son las que estoy usando en el momento, ahora la entidad 3 esta null y no la pienso usar, el problema es que entityFramework ve que hay otra entidad y cuando va a hacer el save changes() me da un error indicando que una columna no existe pero es por esa entidad3, hay manera de decirle a entity que me ignore esa entidad?? o habra que enviarla inicializada al menos y no null??



    • Editado CrissR martes, 11 de julio de 2017 2:41
    sábado, 8 de julio de 2017 2:45

Todas las respuestas

  • Depende, es ¿Entity Framework code-first o database-first? Si estás usando database first, significa que pripiedad4 es NOT NULL y tiene un FK a la tabla3. Cambia la BD para que acepte NULL, o quita directamente el campo y la FK si no lo vas a usar. Después, regenera las entidades en tu programa.

    Si es code-first, busca la clase donde defines la entidad y asegúrate de que la propiedad es nullable.

    sábado, 8 de julio de 2017 7:22
  • Hola alberto gracias por responder, es que esa ultima propiedad no es un campo, es otra entidad (otra tabla) la cual no voy a llenar en esa transacción, no se por que entity intenta hacer un insert cuando esa entidad esta null. quiero solamente hacer el insert en las dos entidades que uso(dos tablas).

    No se si es database first o code first, apenas aprendo, como puedo mirar eso?? creería que es code first pq todo lo hago por código, no he configurado entity con la db.

    sábado, 8 de julio de 2017 18:08
  • hola

    >>No se si es database first o code first, apenas aprendo, como puedo mirar eso?

    si entity framework code entiendo que el database first no aplica, ya que no hay un modelo edmx, sino que se mapea usando codigo

    ..cuando va a hacer el save changes() me da un error indicando que una columna no existe pero es por esa entidad3, hay manera de decirle a entity que me ignore esa entidad??

    cual es el mensaje exacto que recibes? porque una cosa es que la columna no exita y otra que el dato sea opcional, son cosas muy distintas

    si falta la columna quiere decir que el modelo y el mapping estan desincronizados y deberias tener esa columna en la tabla, ahora si el dato no quieres asignarlo deberias indicar en el mapping que esa relacion HasOptional()

    [Entity Framework][Code First] Asociación uno a muchos a muchos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 10 de julio de 2017 15:31
  • Hola Leandro, Muchas gracias por responder.

    Este es el error que genera

    {System.Data.SqlClient.SqlException: Invalid column name 'ProgramacionId'.   

    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()   at System.Data.SqlClient.SqlDataReader.get_MetaData()   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior)   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, String executeMethod, IReadOnlyDictionary`2 parameterValues, Boolean closeConnection)   at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)   at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection)ClientConnectionId:0ffb5771-661a-4f94-8da8-e308836cf356Error Number:207,State:1,Class:16}

    Pero ese ProgramacionId no existe, es mas en la clase programación va el id de equipo detalle mas no al revés, no se que sea.

    revise el post que pones pero exactamente hago eso, va null entonces lo debería tomar como opcional pero no lo hace. Que puede ser???

    martes, 11 de julio de 2017 2:39
  • agradezco quien sepa me de una idea, sigo perdido en el tema.
    martes, 11 de julio de 2017 17:52