Clé étrangère NULL Entity Framework en premier code

107

J'ai un modèle User< Country. Un utilisateur appartient à un pays, mais ne peut en appartenir à aucun (clé étrangère nulle).

Comment configurer cela? Lorsque j'essaie d'insérer un utilisateur avec un pays nul, cela me dit qu'il ne peut pas être nul.

Le modèle est le suivant:

 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;}
}

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

Shawn Mclean
la source
Pouvez-vous me corriger si je me trompe. Une clé étrangère est NULLABLE par DEFAULT dans le code first asp.net mvc - 5 entity framework.
Incassable
1
Si nous voulons le rendre non nullable. nous devons soit utiliser une API fluide, sinon décorer avec l'attribut "Requis". Ai-je raison?
Incassable
2
Si nous ne faisons ni l'un ni l'autre, la clé étrangère sera définie par défaut sur Nullable
Incassable

Réponses:

166

Vous devez rendre votre clé étrangère Nullable:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}
Ladislav Mrnka
la source
7
que fait le virtuel?
Shawn Mclean le
32
Le virtuel est nécessaire pour le chargement paresseux.
Ladislav Mrnka le
2
Virtual ajoute également le suivi des modifications, ce qui n'est pas toujours souhaité. À peu près la seule fois où nous voulons du virtuel, c'est sur les collections, mais YMMV.
Dan VanWinkle
1
@TravisJ user.Country renvoie null alors ... soit attraper l'exception (optimale), soit utiliser if(eww)
SparK
7
De plus, cela ne semble pas fonctionner pour les Guidclés basées. (Cela les rend nullables, bien sûr, mais l'enregistrement d'un enregistrement dans la base de données avec la clé étrangère définie sur null échoue en raison d'une contrainte de clé étrangère générée automatiquement.) :-(
BrainSlugs83
8

Je préfère ceci (ci-dessous):

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

Parce qu'EF créait 2 clés étrangères dans la table de base de données: CountryId et CountryId1, mais le code ci-dessus a corrigé cela.

utilisateur1040323
la source
6

J'ai le même problème maintenant, j'ai une clé étrangère et je dois la mettre comme nullable, pour résoudre ce problème, vous devez mettre

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

dans la classe DBContext, je suis désolé de vous répondre très tard :)

Yaman Melhem
la source