Entity Framework HasForeignKey не работает - PullRequest
0 голосов
/ 21 февраля 2019

Я сталкиваюсь со странным поведением 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; }
}

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете попробовать добавить в Customer

public virtual ICollection<Consignment> Consignments { get; set; }

и изменить на

HasRequired(x => x.Customer)
            .WithMany(x=>x.Consignments)
            .HasForeignKey(x => x.CustomerId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...