Entity Framework - pierwszy pusty klucz obcy

107

Mam User< Countrymodel. Użytkownik należy do kraju, ale nie może należeć do żadnego (pusty klucz obcy).

Jak to ustawić? Kiedy próbuję wstawić użytkownika z pustym krajem, mówi mi, że nie może być pusty.

Model wygląda następująco:

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

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

Shawn Mclean
źródło
Czy możesz mnie uprzejmie poprawić, jeśli się mylę. Klucz obcy ma wartość NULLABLE przez DEFAULT w kodzie pierwszej platformy jednostki asp.net mvc - 5.
Unbreakable
1
Jeśli chcemy, aby nie dopuszczała wartości null. jeśli nie, musimy użyć fluent api, a następnie ozdobić je atrybutem „Required”. Mam rację?
Unbreakable
2
Jeśli tego nie zrobimy, klucz obcy zostanie domyślnie ustawiony na Nullable
Unbreakable

Odpowiedzi:

165

Musisz nadać kluczowi obcemu wartość null:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}
Ladislav Mrnka
źródło
7
co robi wirtualny?
Shawn Mclean,
32
Wirtualne jest niezbędne do leniwego ładowania.
Ladislav Mrnka
2
Virtual dodaje również śledzenie zmian, co nie zawsze jest pożądane. Prawie jedyny raz, kiedy chcemy, aby wirtualny był w kolekcjach, ale YMMV.
Dan VanWinkle
1
@TravisJ user.Country zwraca wartość null, a następnie ... albo złap wyjątek (optymalny), albo użyj if(
eww
7
Ponadto - wydaje się, że to nie działa w przypadku Guidkluczy bazowych. (To sprawia, że ​​są one dopuszczalne do wartości null,
jasne
8

Wolę to (poniżej):

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

Ponieważ EF tworzył 2 klucze obce w tabeli bazy danych: CountryId i CountryId1, ale powyższy kod naprawił to.

user1040323
źródło
6

Mam teraz ten sam problem, mam klucz obcy i muszę ustawić go jako zerowy, aby rozwiązać ten problem, który należy umieścić

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

w klasie DBContext przepraszam za bardzo późną odpowiedź :)

Yaman Melhem
źródło