Я сталкиваюсь со странным поведением HasForeignKey в EF 6.2.
Класс Consignment имеет два свойства Customer и Sender:
public class Consignment
{
public Consignment()
{
Sender = new Sender();
Customer = new Customer();
}
public string OrderNo { get; set; }
public Customer Customer { get; set; }
public Sender Sender { get; set; }
public int CustomerId { get; set; }
}
CustomerId - это внешний ключ для Customer.Объекты, настроенные следующим образом:
public class ConsignmentEntityConfiguration : EntityTypeConfiguration<Consignment>
{
public ConsignmentEntityConfiguration()
{
HasKey(s => s.OrderNo);
HasRequired(x => x.Customer)
.WithMany()
.HasForeignKey(x => x.CustomerId);
HasRequired(x => x.Sender)
.WithMany()
.Map(x => x.MapKey("SenderId"));
}
}
public class SenderEntityConfiguration : EntityTypeConfiguration<Sender>
{
public SenderEntityConfiguration()
{
HasKey(x => x.Number);
}
}
public class CustomerEntityConfiguration : EntityTypeConfiguration<Customer>
{
public CustomerEntityConfiguration()
{
HasKey(x => x.Id);
}
}
Заказчик и отправитель настроены практически одинаково, за исключением того, что Заказчик настраивает со свойством HasForeignKey, а Отправитель настроен со свойством карты.
Итак, когда я получаю консигнацию из БД,как в запросе
var consignment = context.Set<Consignment>().Include(x => x.Customer).Include(x => x.Sender).FirstOrDefault();
Я получаю груз с правильным отправителем, но с пустым клиентом (все свойства являются нулевыми или пустыми).Стремительная, ленивая и явная загрузка приводит к одним и тем же результатам.
SQL Server получает и проецирует Customer в обычном режиме, но EF возвращает пустого Customer (как после нового Customer ())
Итак, когда я удаляю CustomerIdсвойство из модели и настройте Customer с помощью .Map, все работает отлично.
HasRequired(x => x.Customer)
.WithMany()
.Map(x => x.MapKey("CustomerId"));
Когда я воссоздаю ту же модель в новом тестовом проекте (с простыми классами), HasForeignKey работает должным образом.
Чего мне не хватает в оригинальном проекте?Классы довольно простые, и я трижды проверил все конфигурации, исходный проект и тестовый проект выглядят одинаково, но работают по-разному ...
Немного упрощенные классы:
public class Sender
{
public string Number { get; set; }
public string Code { get; set; }
public string Name { get; set; }
}
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string MobilePhone { get; set; }
}