Чтобы добавить свойство навигации без внешнего ключа в EF Core, выполните миграцию в первую очередь с помощью DB. NET Core Web API - PullRequest
0 голосов
/ 28 апреля 2020

Я работаю с существующей системой и обновляю ее до. NET Core, Web API и EF Core.

Существующая система имеет 2 таблицы:

  • Родительская таблица : Id, name, et c ..
  • Дочерняя таблица: Id, ParentId, name и др. c ..

Хотя ParentId существует в дочерней таблице нет ссылки на внешний ключ, но я хочу иметь возможность использовать include при запросе родителя. Я попросил не добавлять FK в процессе удаления, они помещают значения -ve в столбец parentId. Таким образом они могут вернуть его обратно, и таким образом была построена унаследованная система.

Теперь, при перенастройке db-first, как я могу указать свойство навигации без fk, чтобы мое EF Core действовало реляционно; или, по крайней мере, вернуть их вместе. Добавлять обнуляемый внешний ключ нельзя, так как это приведет к поломке системы при добавлении значений -ve.

Я предлагал полную очистку БД и избавление от значений -ve, но это требует большого количества тестирования и не доставляется. Короче говоря, как добавить свойство навигации без внешнего ключа в первую миграцию базы данных?

Я попытался добавить коллекцию и виртуальную запись в модель, но после миграции она была перезаписана. Я добавил это, используя HasMany на построителе моделей согласно этому документу - https://docs.microsoft.com/en-us/ef/core/modeling/relationships?tabs=fluent-api%2Cfluent-api-simple-key%2Csimple-key

Но леса перекрывают мое свойство навигации

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Я нашел ответ для этого.

В ядре EF 3.x dbcontext, созданный скаффолдингом DBFrist, является частичными классами. Поэтому я сделал следующее: 1. новый частичный класс для класса контекста - здесь я добавил отношение свойства навигации, используя метод OnModelCreatingPartial (). Пример ниже

public partial class dbContext : DbContext
{
    partial void OnModelCreatingPartial(ModelBuilder builder)
    {
        builder.Entity<Packcomponent>()
        .HasOne(p => p.Pack)
        .WithMany(b => b.PackComponent)
        .HasForeignKey(p => p.PackId);
    }
}

расширил частичный класс в новом файле и добавил туда свойство навигации.


 public partial class Packcomponent
 {
   public Pack Pack { get; set; }
 }
 public partial class Pack
 {
   public List PackComponent { get; set; }
 }

Таким образом, при создании леса он не перезаписывал пользовательский Свойства навигации, и я также мог бы использовать эти свойства для выполнения операций EF, таких как .Include (), а также для сохранения связанных объектов. Это довольно круто !!

0 голосов
/ 28 апреля 2020

Пожалуйста, объясните '-ve значения', которые вы упоминаете в своем вопросе несколько раз.

...