#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! Я просто хотел убедиться, что это работает так же.