Ссылка на внешний ключ EF с использованием идентификатора против объекта - PullRequest
0 голосов
/ 20 февраля 2019

В чем разница между ссылкой на внешний ключ с использованием идентификатора и объекта.

Например: отношение FK с использованием идентификатора

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }

    public int CategoryId { get; set; }
}

против отношения FK с использованием объекта

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }

    public Category Category { get; set; }
}

Я заметил из базы данных, что при использовании свойства Id столбец по существу становится ненулевым полем.

Это единственное отличие?Я думаю, что мы не можем запрашивать несколько таблиц одновременно, т.е. запрашивать связанные данные?

Когда мне следует выбрать один из вариантов?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

В основном это зависит от вашего варианта использования и типа связанных с загрузкой данных , которые вы выбираете.Используете ли вы идентификатор или ссылку на объект или отношение full с обеих сторон (идентификатор и объект), это зависит от общей архитектуры приложения.Если вы будете везде использовать full или ссылку на объект, у вас (вероятно) будет беспорядок, и вы не будете знать, следует ли вам запрашивать некоторые объекты, используя их репозиторий, или будет нормально включатьих на какой-то другой запрос.Я настоятельно рекомендую вам взглянуть на эту книгу, особенно главу 19 (Агрегаты) и 21 (Хранилища).Там у вас есть подробное объяснение того, что я имел в виду, и многое другое.(Это относится не только к приложениям, встроенным в DDD way)

0 голосов
/ 20 февраля 2019

В первом примере вы не добавляете связь, а просто целочисленное свойство с именем CategoryId.Во втором примере Entity Framework создаст целочисленный столбец с именем «Category_ID», но вы не сможете увидеть это свойство в своей модели, поэтому я хотел бы явно добавить его самостоятельно и иметь возможность использовать его вместе ссвойство навигации.

class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string PhoneNumber { get; set; }


    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public Category Category{get;set;}
}

Таким образом, вы также можете управлять типом данных CategoryId, чтобы вы могли сделать его необязательным (обнуляемым)

public int? CategoryId { get; set; }

* Примечание к данным внешнего ключа не являетсянеобходимо, если только у вас нет имен свойств или свойств навигации, которые не соответствуют соглашению об именах для имен свойств внешнего ключа (спасибо Bardr)

Это означает, что вы создаете отношение 1 ко многим (1- *) стовары и категории, поэтому в вашем классе Category вы бы добавили свойство навигации по коллекции для товаров

class Category
{
  public int Id{ get; set;}
  public string Name{ get; set; }
  ...
  public ICollection<Product> Products{get; set;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...