Entity framework code-first null clave externa


107

Tengo un User< Countrymodelo. Un usuario pertenece a un país, pero no puede pertenecer a ninguno (clave foránea nula).

¿Cómo configuro esto? Cuando intento insertar un usuario con un país nulo, me dice que no puede ser nulo.

El modelo es el siguiente:

 public class User{
    public int CountryId { get; set; }
    public Country Country { get; set; }
}

public class Country{
    public List<User> Users {get; set;}
    public int CountryId {get; set;}
}

Error: A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = Country_Users ]"}


¿Pueden corregirme si me equivoco? Una clave externa es NULABLE por DEFAULT en el código primero asp.net mvc - 5 entity framework.
Irrompible

1
Si queremos hacerlo no anulable. Necesitamos usar una API fluida si no, decorar con el atributo "Requerido". ¿Estoy en lo correcto?
Irrompible

2
Si no lo hacemos, la clave externa se establecerá de forma predeterminada en Nullable
Unbreakable

Respuestas:


165

Debe hacer que su clave externa sea anulable:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}

7
¿Qué hace lo virtual?
Shawn Mclean

32
Virtual es necesario para la carga diferida.
Ladislav Mrnka

2
Virtual también agrega seguimiento de cambios, lo que no siempre se desea. Casi la única vez que queremos virtual es en colecciones, pero YMMV.
Dan VanWinkle

1
@TravisJ user.Country devuelve nulo y luego ... captura la excepción (óptima) o usa if(eww)
SparK

7
Además, esto no parece funcionar para Guidclaves basadas. (Los hace anulables, claro, pero guardar un registro en la base de datos con la clave externa configurada en nulo falla debido a una restricción de clave externa generada automáticamente) :-(
BrainSlugs83

8

Prefiero esto (abajo):

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    [ForeignKey("CountryId")]
    public virtual Country Country { get; set; }
}

Porque EF estaba creando 2 claves externas en la tabla de la base de datos: CountryId y CountryId1, pero el código anterior lo solucionó.


6

Tengo el mismo problema ahora, tengo una clave externa y necesito ponerla como anulable, para resolver este problema debes poner

    modelBuilder.Entity<Country>()
        .HasMany(c => c.Users)
        .WithOptional(c => c.Country)
        .HasForeignKey(c => c.CountryId)
        .WillCascadeOnDelete(false);

en la clase DBContext, lamento responderte muy tarde :)


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.