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 ]"}

Shawn Mclean
fuente
¿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; }
}
Ladislav Mrnka
fuente
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ó.

usuario1040323
fuente
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 :)

Yaman Melhem
fuente