Emisión de clave externa EF Core 1.0

entity-framework entity-framework-core

Pregunta

Realmente no entiendo es este error EF Core 1.0?

public class User : BaseEntity
{
    public string Username { get; set; }
}
public class UserDetail : BaseEntity
{
    public int UserId { get; set; }
    public string Address { get; set; }
    public string Country { get; set; }

    public virtual User User { get; set; }

    [ForeignKey("UserId")]
    public virtual ICollection<UserLanguage> Languages { get; set; }
}

public class UserLanguage : BaseEntity
{
    public string Name { get; set; }
    public int UserId { get; set; }
}

En mi tabla de usuarios tengo 3 usuarios

Id          Username
----------- ---------------

1           john
2           doe
3           jack

En mi UserDetail tengo 2 registros

Id          UserId      Address                                           Country
----------- ----------- -------------------------------------------------- ------
1           1           Some Address                                       MY
2           3           NULL                                               SG

En mi idioma del usuario cuando realice la inserción

INSERT INTO UserLanguage(Name, UserId)
VALUES ('English', 3) 

se encontrará debajo de error

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_UserLanguage_UserDetail_UserId". The conflict occurred in database "Job", table "dbo.UserDetail", column 'Id'.

¿Qué hago mal aquí? ForeignKey es UserId por qué apunta a la columna UserDetail 'Id'

Respuesta aceptada

prueba lo siguiente

public class User : BaseEntity
{
    public string Username { get; set; }

    public virtual ICollection<UserLanguage> Languages { get; set; }
}
public class UserDetail : BaseEntity
{
    public int UserId { get; set; }
    public string Address { get; set; }
    public string Country { get; set; }

    public virtual User User { get; set; }        
}

public class UserLanguage : BaseEntity
{
    public string Name { get; set; }
    public int UserId { get; set; }

    public virtual User User { get; set; } 
}

El problema estaba en la siguiente línea de código.

[ForeignKey("UserId")]
public virtual ICollection<UserLanguage> Languages { get; set; }

esto creó una relación de clave externa entre la tabla UserDetail y UserLanguage mientras que usted quería crearla entre la tabla User y UserLanguage.

En su esquema existente si intenta insertar

INSERT INTO UserLanguage(Name, UserId)
VALUES ('English', 1) 
INSERT INTO UserLanguage(Name, UserId)
VALUES ('French', 2) 

Tendrá éxito ya que UserDetail tiene dos entradas con 1,2 PK, mientras que no hay ninguna entrada con PK 3 en UserDetail.


Respuesta popular

A su clase de UserLanguage intente agregar:

public virtual UserDetail UserDetail  { get; set; }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué