I've just activated lazy loading on our entities, which all have auto-incremented keys.
I notice that on an instance of an entity added to the DbSet (and not yet saved), if I access a collection, a query is executed with a filter on a temporary id :
SELECT o."Id", o."OrderId", o."Price", o."ProductId", o."Quantity", o.xmin
FROM "OrderDetail" AS o
WHERE o."OrderId" = @__p_0 /* @__p_0 = -2147482646 */
This request will never return anything. Is this the desired behaviour for this request to be executed and for the collection not to be considered as loaded?
Include your code
The code that produces the previous query:
Order order = new();
order.Details.Add(new OrderDetail()); // This line has no impact on the triggering of the SQL query, so it could be deleted.
dbContext.GetDbSet<Order>().Add(order);
foreach (OrderDetail detail in order.Details) // <-- This line triggers a query
{
detail.Quantity = 1;
}
The Order configuration:
builder.ToTable("Order");
builder.HasKey(e => e.Id).HasName("PK_ORDER");
builder.Property(p => p.CurrencyCode)
.IsRequired();
builder.Property(p => p.CustomerId)
.IsRequired();
builder.Property(p => p.Id)
.ValueGeneratedOnAdd()
.IsRequired();
builder.Property(p => p.OrderNumber)
.IsRequired();
builder.HasOne(e => e.Customer).WithMany(e => e!.Orders).HasForeignKey(e => e.CustomerId).HasConstraintName("FK_Order_Customer").OnDelete(DeleteBehavior.ClientCascade);
builder.Navigation(e => e.Customer).HasField("_customer");
builder.HasMany(e => e.Details);
builder.Navigation(e => e.Details).HasField("_details");
The OrderDetail configuration:
builder.ToTable("OrderDetail");
builder.HasKey(e => e.Id).HasName("PK_ORDERDETAIL");
builder.Property(p => p.Id)
.ValueGeneratedOnAdd()
.IsRequired();
builder.Property(p => p.OrderId)
.IsRequired();
builder.Property(p => p.Price)
.IsRequired()
.HasPrecision(19, 6);
builder.Property(p => p.ProductId)
.IsRequired();
builder.Property(p => p.Quantity)
.IsRequired();
builder.HasOne(e => e.Order).WithMany(e => e!.Details).HasForeignKey(e => e.OrderId).HasConstraintName("FK_OrderDetail_Order").OnDelete(DeleteBehavior.ClientCascade);
builder.Navigation(e => e.Order).HasField("_order");
builder.HasOne(e => e.Product).WithMany(e => e!.OrderDetails).HasForeignKey(e => e.ProductId).HasConstraintName("FK_OrderDetail_Product").OnDelete(DeleteBehavior.ClientCascade);
builder.Navigation(e => e.Product).HasField("_product");
builder.HasIndex(e => e.OrderId).HasDatabaseName("IDX_Order");
The Order entity:
public class Order : BusinessEntity
{
private Customer _customer = null!;
private ICollection<OrderDetail> _details = new System.Collections.Generic.List<EfLazyLoading.Domain.Entities.OrderDetail>();
public Order()
{
}
private Order(ILazyLoader lazyLoader)
: base(lazyLoader)
{
}
public string CurrencyCode { get; set; } = string.Empty;
public int CustomerId { get; set; } = 0;
public int Id { get; set; } = 0;
public string? Notes { get; set; }
public string OrderNumber { get; set; } = string.Empty;
public Customer Customer
{
get { return LazyLoader.Load(this, ref _customer!)!; }
set { _customer = value; }
}
[ForeignKey("OrderId")]
public ICollection<OrderDetail> Details
{
get { return LazyLoader.Load(this, ref _details!)!; }
}
}
The OrderDetail entity:
public class OrderDetail : BusinessEntity, IValidableEntity
{
private Order _order = null!;
private Product _product = null!;
public OrderDetail()
{
}
private OrderDetail(ILazyLoader lazyLoader)
: base(lazyLoader)
{
}
public int Id { get; set; } = 0;
public int OrderId { get; set; } = 0;
public decimal Price { get; set; } = 0.0M;
public int ProductId { get; set; } = 0;
public int Quantity { get; set; } = 1;
public Order Order
{
get { return LazyLoader.Load(this, ref _order!)!; }
set { _order = value; }
}
public Product Product
{
get { return LazyLoader.Load(this, ref _product!)!; }
set { _product = value; }
}
}
Include provider and version information
EF Core version: 7.21.9
Database provider: Npgsql.EntityFrameworkCore.PostgreSQL
Target framework: .NET 7.0
Operating system: Windows 11
IDE: Visual Studio 2022 Version 17.7.3
I've just activated lazy loading on our entities, which all have auto-incremented keys.
I notice that on an instance of an entity added to the DbSet (and not yet saved), if I access a collection, a query is executed with a filter on a temporary id :
This request will never return anything. Is this the desired behaviour for this request to be executed and for the collection not to be considered as loaded?
Include your code
The code that produces the previous query:
The Order configuration:
The OrderDetail configuration:
The Order entity:
The OrderDetail entity:
Include provider and version information
EF Core version: 7.21.9
Database provider: Npgsql.EntityFrameworkCore.PostgreSQL
Target framework: .NET 7.0
Operating system: Windows 11
IDE: Visual Studio 2022 Version 17.7.3