ArgumentException: должен быть приводимым узлом

Я создаю ASP.NET Core Web API для моей компании для управления клиентами и контрактами (дополнительные функции будут добавлены позже). Я следовал этому замечательному руководству ( https://www.freecodecamp.org/news/an-awesome-guide-on-how-to-build-restful-apis-with-asp-net-core-87b818123e28/).

Первая таблица ("Заказчик") прекрасно выполняет запросы с EF Core 3. Однако, когда я пытаюсь запросить другую таблицу ("Контракт"), я получаю ArgumentException: must be reducible node-exception. (Примечание: каждый "Клиент" может иметь много "Контрактов", и каждый "Контракт" связан с одним и только одним "Клиентом".)

Я нашел эту проблему в Google, и большинство решений предлагают обновить EF Core до более поздней версии. Тем не менее, я уже использую EF Core v3 (превью 7), который является последней версией прямо сейчас. Это ошибка в EF Core или я делаю что-то не так?

Код, который я использую:

У меня 2 класса, 1 Customer класс:

public class Customer
{
    // Properties
    public int ID { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public string Segment { get; set; }
    public string Email { get; set; }
    public string ContactPerson { get; set; }
    public bool SendReminders { get; set; } = true;
    public string Notes { get; set; }

    // Foreign Properties
    public IList<Contract> Contracts { get; set; } = new List<Contract>();

    // Logging Properties
    public DateTime CreatedAt { get; set; }
}

И Contract класс:

public class Contract
{
    // Properties
    public int ID { get; set; }
    public string Name { get; set; }
    public string Notes { get; set; }

    // Foreign Properties
    public int CustomerID { get; set; }
    public Customer Customer { get; set; }

    //Logging Properties
    public DateTime CreatedAt { get; set; }
}

Я перекрываю OnModelCreating метод DBContext:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Entity<Customer>().ToTable("Customer");
    builder.Entity<Customer>().HasKey(x => x.ID);
    builder.Entity<Customer>().Property(x => x.ID).IsRequired().ValueGeneratedOnAdd();
    builder.Entity<Customer>().Property(x => x.Name).IsRequired().HasMaxLength(50);
    builder.Entity<Customer>().Property(x => x.Type).HasMaxLength(25);
    builder.Entity<Customer>().Property(x => x.Segment).HasMaxLength(25);
    builder.Entity<Customer>().Property(x => x.ContactPerson).HasMaxLength(50);
    builder.Entity<Customer>().HasMany(x => x.Contracts).WithOne(y => y.Customer).HasForeignKey(y => y.CustomerID);

    builder.Entity<Customer>().HasData(
        new Customer { ID = 100, Name = "Cust1" }, // ID set manually due to in-memory provider
        new Customer { ID = 101, Name = "Cust2" }
    );

    builder.Entity<Contract>().ToTable("Contract");
    builder.Entity<Contract>().HasKey(x => x.ID);
    builder.Entity<Contract>().Property(x => x.ID).IsRequired().ValueGeneratedOnAdd();
    builder.Entity<Contract>().Property(x => x.Name).IsRequired().HasMaxLength(50);

    builder.Entity<Contract>().HasData(
        new Contract { ID = 100, Name = "DLA", CustomerID = 100, Notes = "Cust1 contract" },
        new Contract { ID = 101, Name = "DLA", CustomerID = 101, Notes = "Cust2 contract" }
    );
}

И когда я запрашиваю таблицу "Контракт", чтобы получить все контракты, этот метод вызывается:

public async Task<IEnumerable<Contract>> ListAsync()
{
    return await _context.Contracts.Include(c => c.Customer).ToListAsync();
    //return await _context.Contracts.ToListAsync();
}

Закомментированная строка показывает все контракты, но не соединяет таблицу "Контракт" с таблицей "Клиент". Поэтому я использую Include метод LINQ для этого. Тем не менее, эта строка кода бросает ArgumentException: must be reducible node-exception.

Я строго следовал руководству (но, конечно, изменил название в соответствии с моими потребностями). Я что-то не так делаю, или это просто ошибка в EF Core 3?

Заранее спасибо.

0 ответов

Другие вопросы по тегам