Entity framework code-first null chiave esterna


107

Ho un modello User< Country. Un utente appartiene a un paese, ma non può appartenere a nessuno (chiave esterna nulla).

Come lo imposto? Quando provo a inserire un utente con un paese nullo, mi dice che non può essere nullo.

Il modello è il seguente:

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

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


Puoi gentilmente correggermi se sbaglio. Una chiave esterna è NULLABILE per DEFAULT nel codice prima asp.net mvc - 5 entity framework.
Indistruttibile

1
Se vogliamo renderlo non annullabile. dobbiamo usare un'API fluente, altrimenti decorare con l'attributo "Richiesto". Ho ragione?
Indistruttibile

2
In caso contrario, la chiave esterna verrà impostata su Nullable
Unbreakable

Risposte:


165

Devi rendere nullable la tua chiave esterna:

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

7
cosa fa il virtuale?
Shawn Mclean

32
Il virtuale è necessario per il caricamento lento.
Ladislav Mrnka

2
Virtual aggiunge anche il rilevamento delle modifiche, che non è sempre desiderato. L'unica volta che vorremmo il virtuale è nelle raccolte, ma YMMV.
Dan VanWinkle

1
@TravisJ user.Country restituisce null quindi ... o cattura l'eccezione (ottimale) o usa if(eww)
SparK

7
Inoltre, questo non sembra funzionare per le Guidchiavi basate. (Li rende nullable, certo, ma il salvataggio di un record nel database con la chiave esterna impostata su null non riesce a causa di un vincolo di chiave esterna generato automaticamente.) :-(
BrainSlugs83

8

Preferisco questo (sotto):

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

Perché EF stava creando 2 chiavi esterne nella tabella del database: CountryId e CountryId1, ma il codice sopra lo ha risolto.


6

Ho lo stesso problema ora, ho una chiave esterna e devo metterla come nullable, per risolvere questo problema dovresti mettere

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

nella classe DBContext mi dispiace per averti risposto molto tardi :)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.