Код сутності фреймворку - перший нульовий зовнішній ключ


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 ]"}


Чи можете ви ласкаво виправити мене, якщо я помиляюся. Іноземний ключ - НЕЗАЛЕЖНИЙ за DEFAULT в коді спочатку asp.net mvc - 5 фреймворк сутності.
Незламний

1
Якщо ми хочемо зробити це не нульовим. нам потрібно або використовувати вільні api, якщо не, то прикрасити атрибутом "Обов'язково". Я прав?
Незламний

2
Якщо ми не будемо робити ні тоді зовнішній ключ буде по замовчуванням Nullable
Unbreakable

Відповіді:


165

Ви повинні зробити свій зовнішній ключ нульовим:

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

7
що робить віртуальний?
Шон Мклін

32
Віртуальний необхідний для ледачого завантаження.
Ладислав Мрнка

2
Також віртуальний додає відстеження змін, що не завжди хочеться. Про єдиний раз, коли ми хочемо віртуальний, - це колекції, але YMMV.
Dan VanWinkle

1
@TravisJ user.Country повертає null, то ... або зловити виняток (оптимальний), або використовувати if(eww)
SparK

7
Крім того - це, здається, не працює на Guidбазі ключів. (Це робить їх нульовими, безумовно, але збереження запису в базі даних із зовнішнім ключем, встановленим на нуль, не вдається через автоматично створене обмеження зовнішнього ключа.) :-(
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

У мене зараз така ж проблема, у мене є зовнішній ключ, і мені потрібно поставити його як нульовий, щоб вирішити цю проблему, ви повинні поставити

    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.