Похоже, что Entity Framework (последняя версия от NuGet) может игнорировать конфигурацию HasRequired при создании соединений для свойств навигации, отличных от первого определенного.
Например, для объекта POCO (Person) со следующей конфигурацией:
var person = modelBuilder.Entity<Person>();
person.ToTable("The_Peoples");
person.HasKey(i => i.Id);
person.Property(i => i.Id).HasColumnName("the_people_id");
person.HasRequired(i => i.Address)
.WithMany()
.Map(map => map.MapKey("address_id"));
person.HasRequired(i => i.WorkPlace)
.WithMany()
.Map(map => map.MapKey("work_place_id"));
Я пытаюсь загрузить список людей со следующим запросом:
myContext.Set<People>()
.Include(o => o.Address)
.Include(o => o.WorkPlace);
Entity Framework генерирует следующий запрос:
FROM [dbo].[The_Peoples] AS [Extent1]
INNER JOIN [dbo].[The_Addresses] AS [Extent2] ON [Extent1].[address_id] = [Extent2].[address_id]
LEFT OUTER JOIN [dbo].[The_Work_Places] AS [Extent3] ON [Extent1].[work_place_id] = [Extent3].[work_place_id]
Обратите внимание, что соединение с таблицей *The_Addresses* является внутренним соединением (как и ожидалось), однако последующее соединение с *The_Work_Places* является внешним соединением. Учитывая, что свойства Address и WorkPlace помечены как обязательные, я ожидаю, что оба соединения будут внутренними соединениями. Я также попытался пометить свойства Address и WorkPlace атрибутом Required, но это не дало никакого эффекта.
Это баг или я что-то неправильно настроил? Предложения?