Entity Framework, Code First: как я могу сделать внешний ключ не обнуляемым

1

Все возможности изменить модель базы данных с Fluent API, которые я нашел до сих пор, предполагают, что свойство, которое я хочу редактировать, также является свойством в сущности. Но я не знаю, как изменить атрибуты свойства, которое не является свойством в классе сущности.

Пример:

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public List<Address> Addresses { get; set; }

    public Person()
    {
        this.Addresses = new List<Address>();
    }
}
public class Address
{
    public int AddressId { get; set; }
    public string Street { get; set; }
    public string City { get; set; }
    public string Country { get; set; }
}

Теперь Code First создает базу данных, в которой таблица Addresses имеет PersonId как FK, поэтому имеет отношение 1 к * (что я хочу). Но FK PersonId in Addresses имеет значение NULL, и я не могу получить доступ к этому FK в Fluent API, поскольку нет свойства. Как я могу изменить этот FK на непустую?

Кроме того, в тот момент, когда я хочу удалить Person, EF не позволяет мне делать это, поскольку есть связанный адрес. Я думал, что это поведение:

  • nullable FK: удалить указанную запись, установить дочернюю запись FK в значение null
  • not-nullable: ошибка или удалить запись вместе со всеми связанными записями (в зависимости от каскадных правил)

Это неправильно?

Теги:
entity-framework
foreign-key-relationship

2 ответа

1
Лучший ответ

Следующая директива Fluent API сделала это для меня, поэтому для достижения

  • 1-to-* отношения
  • FK не имеет значения
  • FK не определен как свойство в классе сущности
  • cascade delete (удаление родителя удаляет все связанные записи, здесь Адреса)

следующее выражение должно быть включено в OnModelCreating

modelBuilder.Entity<Person>().HasMany(a => a.Addresses).WithRequired().WillCascadeOnDelete(true);
0

Для начала вы должны сделать ключ с ключем по-другому.

Вот как

Для второго вам придется использовать свободный API для этого.

Попробуйте добавить ниже в контекст БД

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

    modelBuilder.Entity<Person>()
        .HasOptional(a => a.Address)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
    }

Для получения дополнительной информации см. Эту ссылку

  • 0
    Извините, я перепутал тему. Смотрите подробное вступительное сообщение: на самом деле я хочу необнуляемый FK. Для второго: когда я использую это, Code First хочет удалить столбец FK в адресах и добавить FK в таблицу Person, чтобы у меня больше не было отношения 1 к *
  • 0
    я понял! Я создам ответ и отмечу его как принятый, хотя ваш пост вдохновил вас, так что спасибо!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню