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


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

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.


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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.