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?
Заранее спасибо.