Похоже, что Entity Framework (последняя версия от NuGet) может игнорировать конфигурацию HasRequired при построении объединений для Navigation Properties, отличных от первого определенного.
Например, учитывая объект 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, но это не дало никакого эффекта.
Это ошибка или я что-то неправильно настроил? Suggestions?