none
Error Entity Framework Core Relacion uno a uno RRS feed

  • Pregunta

  • Chicos muy buenas como van,bueno traigo un tema realmente simple al que no le estoy encontrando la vuelta.

    Estoy usando EF Core Code First y API Fluent para configurar todo,cuestion que tengo una relacion uno a uno la cual deberia ser simple pero algo no me esta cuadrando.Detallo Rapidamente para ser consizo > 

    1 Paciente tiene 1 Cobertura 

    

    Al momento de querer insertar un segundo registro con el mismo CoberturaId a traves de la aplicacion 

    

    Pero si quiero insertar el registro directamente en la base tambien > 

    Dejo el Codigo del API Fluent 

    Espero haber sido claro y se que puede ser un tema para tratar en SQL,pero como mi cuestion viene por EF Core quiero entenderlo bien por ahi tambien.

    Miles de Gracias y perdon por la simpleza,se que es sencillo pero no me esta saliento verlo con un enfoque distinto.


    Luciano Leonel

    miércoles, 16 de octubre de 2019 2:55

Respuestas

  • El problema viene precisamente de que has definido la relacion como "de uno a uno", pero segun el mensaje de error estas tratando de insertar un registro como si la relacion fuera "de uno a muchos". En otras palabras, estas intentando grabar un registro que tiene CoberturaId=1, pero ya existe en la tabla otro registro que tiene CoberturaId=1. Por eso te lo rechaza; si te permitiera insertarlo tendrias dos registros en la primera tabla relacionados con el mismo registro de la segunda tabla, y se violaria la relacion de 1 a 1.

    Editado: Si necesitas que dos pacientes puedan tener la misma cobertura, entonces es una relacion de 1 a muchos, no de 1 a 1 (1 cobertura para muchos pacientes). Eso se configura en EF cambiando la entidad Cobertura de manera que el campo Paciente sea de tipo IEnumerable<PacienteEntity> en lugar de ser simplemente de tipo PacienteEntity (y tipicamente la propiedad se llamaria "Pacientes" en lugar de "Paciente").
    miércoles, 16 de octubre de 2019 11:56
    Moderador
  • hola

    Si tienes un FK en la tabla entonces no es una relacion uno a uno, es una relacion uno a mucho

    Para que sea uno a uno en ambas tablas se relaciona por la PK

    O sea, si en la tabla pacientes la PK es DNI en la tabla de cobertura la PK tambien deberia ser el DNI

    Configuring One To One Relationships In Entity Framework Core

    como veras en el ejemplo, en tu caso DNI mapea con CoberturaId, sino no seria una relacion uno a uno

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 16 de octubre de 2019 15:32

Todas las respuestas

  • El problema viene precisamente de que has definido la relacion como "de uno a uno", pero segun el mensaje de error estas tratando de insertar un registro como si la relacion fuera "de uno a muchos". En otras palabras, estas intentando grabar un registro que tiene CoberturaId=1, pero ya existe en la tabla otro registro que tiene CoberturaId=1. Por eso te lo rechaza; si te permitiera insertarlo tendrias dos registros en la primera tabla relacionados con el mismo registro de la segunda tabla, y se violaria la relacion de 1 a 1.

    Editado: Si necesitas que dos pacientes puedan tener la misma cobertura, entonces es una relacion de 1 a muchos, no de 1 a 1 (1 cobertura para muchos pacientes). Eso se configura en EF cambiando la entidad Cobertura de manera que el campo Paciente sea de tipo IEnumerable<PacienteEntity> en lugar de ser simplemente de tipo PacienteEntity (y tipicamente la propiedad se llamaria "Pacientes" en lugar de "Paciente").
    miércoles, 16 de octubre de 2019 11:56
    Moderador
  • Buenos dias Alberto,desde ya muchas gracias,ves que me estaba faltando mirarlo distinto como dije,ahora simplemente tengo que hacer eso,no hay que crear una tabla intermedia como seria una relacion de muchos a muchos no?

    Luciano Leonel

    miércoles, 16 de octubre de 2019 13:40
  • hola

    Si tienes un FK en la tabla entonces no es una relacion uno a uno, es una relacion uno a mucho

    Para que sea uno a uno en ambas tablas se relaciona por la PK

    O sea, si en la tabla pacientes la PK es DNI en la tabla de cobertura la PK tambien deberia ser el DNI

    Configuring One To One Relationships In Entity Framework Core

    como veras en el ejemplo, en tu caso DNI mapea con CoberturaId, sino no seria una relacion uno a uno

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 16 de octubre de 2019 15:32
  • hola

    >>no hay que crear una tabla intermedia como seria una relacion de muchos a muchos no?

    si tienes una relacion "uno a muchos" no es necesario la tabla intermedia

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 16 de octubre de 2019 15:34
  • no hay que crear una tabla intermedia como seria una relacion de muchos a muchos no?

    No, para "uno a muchos" no se necesita la tabla intermedia. Desde el punto de vista de SQL lo único que habría que hacer es quitar la restricción de unicidad sobre la columna que tiene la FK. Esto te lo hará automáticamente Entity Framework en el momento de crear las tablas si haces en las clases el cambio que te indiqué en la respuesta anterior.

    miércoles, 16 de octubre de 2019 16:24
    Moderador