Внешний ключ Entity framework code-first null

107

У меня User< Countryмодель. Пользователь принадлежит к стране, но не может принадлежать ни к какой стране (пустой внешний ключ).

Как мне это настроить? Когда я пытаюсь вставить пользователя с нулевой страной, он сообщает мне, что он не может быть нулевым.

Модель выглядит следующим образом:

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

Ошибка: A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = Country_Users ]"}

Шон Маклин
источник
Не могли бы вы поправить меня, если я ошибаюсь. Внешний ключ NULLABLE по DEFAULT в коде сначала asp.net mvc - 5 entity framework.
Unbreakable
1
Если мы хотим сделать его не допускающим значения NULL. нам нужно либо использовать свободный API, если нет, то украсить атрибутом «Обязательный». Я прав?
Unbreakable
2
Если мы не сделаем ни того, ни другого, тогда для внешнего ключа по умолчанию будет установлено значение Nullable
Unbreakable

Ответы:

166

Вы должны сделать свой внешний ключ допускающим значение NULL:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}
Ладислав Мрнка
источник
7
что делает виртуальный?
Шон Маклин,
32
Virtual нужен для ленивой загрузки.
Ладислав Мрнка
2
Virtual также добавляет отслеживание изменений, которое не всегда требуется. Примерно единственный раз, когда мы когда-либо хотим виртуальные, это коллекции, но YMMV.
Дэн Ван Винкль,
1
@TravisJ user.Country возвращает null, тогда ... либо поймать исключение (оптимально), либо использовать if(eww)
SparK
7
Также - похоже, это не работает для Guidключей на основе. (Конечно, это делает их допускающими значение NULL, но сохранение записи в базе данных с внешним ключом, установленным в NULL, не удается из-за автоматически сгенерированного ограничения внешнего ключа.) :-(
BrainSlugs83
8

Я предпочитаю это (ниже):

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

Поскольку EF создавал 2 внешних ключа в таблице базы данных: CountryId и CountryId1, но приведенный выше код исправил это.

user1040323
источник
6

У меня такая же проблема, у меня есть внешний ключ, и мне нужно указать его как допускающий значение NULL, чтобы решить эту проблему, вы должны поставить

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

в классе DBContext извините, что ответил вам очень поздно :)

Яман Мельхем
источник