Добавление ссылки на владение объектом в Ef Core - PullRequest
0 голосов
/ 22 марта 2019

У меня есть две сущности: Job и Orderable в нашей базе данных с первым кодом:

(очень простые) модели этих двух:

class Job 
{
     public Guid Id {get; set;}
     public string JobName {get; set;}
     public List<Orderable> Items {get; set;}
}

class Orderable
{
    public Guid Id {get; set;}
    public string MaterialNumber {get; set;}
}

Я хотел иметь возможностьссылаться на Job из заказа, поэтому я добавил свойство следующим образом:

    public Job OwningObject {get; set;}

Но когда я выполнил миграцию, он создал второй внешний ключ для этого объекта.Теперь, кажется, что если я получаю заказы от работы, он использует ключ1, но если я получаю работу от заказа, он использует ключ2.

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

modelBuilder.Entity<Job>().HasMany(x => x.Items).WithOne();

Нам удалось заставить ключ ссылаться на нужное поле с аннотацией данных:

    [ForeignKey("OwningObjectId1")]

Но это кажется хакерским, и мне не нравится это как постоянное решение.

1 Ответ

1 голос
/ 22 марта 2019

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

[ForeignKey(nameof(OwningObject)]
public Guid OwningObjectId { get; set; }
public Job OwningObject { get; set; }

Если вы собираетесь полагаться на свойства теней, вам нужно продумать, что вы делаете.

Во-первых, когда вы используете WithOne() без параметра, оно создаст свойство shadow на основе связанной сущности, которое равно Job. В результате вы получите столбец JobId. Если у вас есть ссылочное свойство, он будет предполагать столбец внешнего ключа на основе имени этого свойства: OwningObjectId. По сути, комбинация ссылочного свойства и , использующего WithOne() и не ссылающегося на это свойство в параметре, фактически создает two , отделяющее отношения один ко многим. Это можно легко исправить, просто указав EF, какое свойство использовать явно:

modelBuilder.Entity<Job>().HasMany(x => x.Items).WithOne(x => x.OwningObject);
...