Entity Framework Code-First Null Fremdschlüssel

107

Ich habe ein User< CountryModell. Ein Benutzer gehört zu einem Land, darf aber keinem gehören (Null-Fremdschlüssel).

Wie richte ich das ein? Wenn ich versuche, einen Benutzer mit einem Nullland einzufügen, wird mir mitgeteilt, dass es nicht null sein kann.

Das Modell ist wie folgt:

 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
quelle
Können Sie mich bitte korrigieren, wenn ich falsch liege? Ein Fremdschlüssel ist von DEFAULT im Code first asp.net mvc - 5 Entity Framework NULLABLE by DEFAULT.
Unbreakable
1
Wenn wir es nicht nullbar machen wollen. Wir müssen entweder eine fließende API verwenden, wenn nicht, dann mit dem Attribut "Erforderlich" dekorieren. Hab ich recht?
Unbreakable
2
Wenn wir dies auch nicht tun, wird der Fremdschlüssel standardmäßig auf Nullable
Unbreakable gesetzt.

Antworten:

165

Sie müssen Ihren Fremdschlüssel auf null setzen:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}
Ladislav Mrnka
quelle
7
Was macht die virtuelle?
Shawn Mclean
32
Virtuell ist für das verzögerte Laden erforderlich.
Ladislav Mrnka
2
Virtual fügt auch Änderungsverfolgung hinzu, was nicht immer erwünscht ist. Ungefähr das einzige Mal, dass wir jemals virtuell wollen, sind Sammlungen, aber YMMV.
Dan VanWinkle
1
@TravisJ user.Country gibt null zurück, dann ... entweder die Ausnahme abfangen (optimal) oder verwenden if(eww)
SparK
7
Auch - dies scheint für Guidbasierte Schlüssel nicht zu funktionieren . (Es macht sie zwar nullbar, aber das Speichern eines Datensatzes in der Datenbank mit dem auf null gesetzten Fremdschlüssel schlägt aufgrund einer automatisch generierten Fremdschlüsseleinschränkung fehl.) :-(
BrainSlugs83
8

Ich bevorzuge dies (unten):

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

Weil EF 2 Fremdschlüssel in der Datenbanktabelle erstellt hat: CountryId und CountryId1, aber der obige Code hat das behoben.

user1040323
quelle
6

Ich habe jetzt das gleiche Problem, ich habe einen Fremdschlüssel und ich muss ihn als nullbar setzen, um dieses Problem zu lösen, das Sie setzen sollten

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

In der DBContext-Klasse tut es mir leid, dass ich Ihnen sehr spät geantwortet habe :)

Yaman Melhem
quelle