Entity framework Включить команду - левое или внутреннее соединение?
Когда я исследовал разницу между Include
и Join
, я обнаружил, что:
Если БД не включает внешние ключи - у него нет навигационных реквизитов, поэтому лучше использовать Join
Если у него есть навигационные реквизиты, используйте Include
. (он также сохраняет удары db.)
Но один ответ здесь привлек мое внимание:
Include реализуется как соединение. В зависимости от допустимостивключенная ссылка - это внутреннее или левое соединение.
Вопрос:
Как недействительность влияет на левое/внутреннее соединение?
В сервере Sql у меня может быть таблица Cities
и таблица Persons
, и у человека может быть NULL
CityID
.
Почему ли сущность Framework решает для меня, что это за соединение?
изменить: визуализация:
![enter image description here]()
![enter image description here]()
Теперь измените значение CityId на null:
![enter image description here]()
И вот это изменение:
![enter image description here]()
Ответы
Ответ 1
Предположим, что в вашем классе существует ограничение [Required]
для City или CityID. И предположим, что есть записи Лица без (действительного) Города. Единственный способ удовлетворить [Required]
- выполнить внутреннее соединение.
Но до тех пор, пока ограничения в вашей комбинации Db и модели (т.е. CityID INT NOT NULL
), не имеет значения, какой тип соединения используется. Это должен быть нормальный случай.
И без ограничения вы, конечно, ожидаете Left Join.
Ответ 2
Я знаю, что это старый вопрос, но если кто-то еще приземляется здесь, используя EF Code First, как и я, моя проблема заключалась в плавных сопоставлениях:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Parent>()
.HasOptional(a => a.Child) /* LEFT OUTER JOIN */
.WithMany()
.HasForeignKey(a => a.ChildId);
}
переводится как LEFT OUTER JOIN, тогда как
modelBuilder.Entity<Parent>()
.HasRequired(a => a.Child) /* INNER JOIN */
.WithMany()
.HasForeignKey(a => a.ChildId);
переводится как INNER JOIN.