Лучший подход для одного ко многим в EF

#c# #entity-framework #one-to-many

#c# #entity-framework #один ко многим

Вопрос:

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

Сценарий 1

 public class Foo
{
    public int FooId { get; set; }
    public virtual Bar Bar { get; set; }
}

public class Bar
{
    public int BarId { get; set; }
}
  

Сценарий 2

 public class Foo
{
    public int FooId { get; set; }
    public int BarId { get; set; }
    public virtual Bar Bar { get; set; }
}

public class Bar
{
    public int BarId { get; set; }
    public virtual ICollection<Foo> Foos { get; set; }
}
  

В обоих случаях EF будет генерировать таблицы с соответствующими столбцами и внешними ключами. Итак, один сценарий лучше другого?

Извините за мой английский и спасибо за вашу помощь 🙂

Комментарии:

1. «Разница» в каком смысле? Вы добавили virtual во втором сценарии, и это определенно разница, но, вероятно, не та разница, о которой вы спрашиваете

2. # 1 не будет работать с public Bar Bar { get; set; } и без public int BarId { get; set; }

3. О да, я должен проверить это в первую очередь. Но это работает в первом сценарии public virtual Bar Bar { get; set; } и без public int BarId { get; set; }

4. Вот некоторые справочные сведения о внешних ключах Почему Entity Framework повторно вставляет существующие объекты в мою базу данных? msdn.microsoft.com/en-us/magazine/dn166926.aspx и обходиться отсутствующими внешними ключами msdn.microsoft.com/en-us/magazine/hh708747.aspx

Ответ №1:

Это не лучше и не хуже.

Модель EDM, вычитаемая из вашего кода первой, довольно похожа (возможно, равна) в обоих случаях.

Однако есть очень важное отличие: во втором случае у вас есть доступ к нескольким вещам, которые отсутствуют в первом:

  • в BarId Foo
  • в Foos Bar

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

ИТАК, единственный вопрос: вам нужно получить доступ к Foos из Bar ? Вам нужно получить доступ к BarId в Foo ? Это единственное реальное различие.

Комментарии:

1. Спасибо, JotaBe! Я просто хотел убедиться, что это работает так же.