Внешний ключ 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, но приведенный выше код исправил это.


6

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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.