Похоже, что 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, но это никак не отразилось.
Это ошибка или, возможно, я что-то неправильно настроил?Предложения?