I created a database as follows
CREATE TABLE customers
(
id UUID PRIMARY KEY
);
CREATE TABLE customer_addresses
(
customer_id UUID REFERENCES customers (id) NOT NULL,
valid_since TIMESTAMPTZ DEFAULT NOW NOT NULL,
address TEXT NOT NULL,
PRIMARY KEY (customer_id, valid_since)
);
customers holds some customer related data (omitted for brevity) and customer_addresses contains data a list of all addresses registered to the users. The active address is the address with the most recent valid_since entry.
I want to use EF Core, so I created entity classes with corresponding configurations as follows:
public class DbCustomer
{
public required Guid Id { get; set; }
public DbAddress Address { get; set; } = null!;
}
internal class CustomersConfiguration : IEntityTypeConfiguration<DbCustomer>
{
public void Configure(EntityTypeBuilder<DbCustomer> builder)
{
builder.ToTable("customers");
builder.HasKey(x => x.Id);
builder.Property(x => x.Id).HasColumnName("id");
builder
.HasOne(x => x.Address)
.WithMany()
.HasForeignKey(x => { x.Id, /* Here I want the latest ValidSince of all DbAddresses */ })
.IsRequired();
}
}
and
public class DbAddress
{
public required Guid CustomerId { get; set; }
public required DateTimeOffset ValidSince { get; set; }
public required string Address { get; set; }
}
internal class CustomersConfiguration : IEntityTypeConfiguration<DbAddress>
{
public void Configure(EntityTypeBuilder<DbAddress> builder)
{
builder.ToTable("customer_addresses");
builder.HasKey(x => new { x.Id, x.ValidSince });
builder.Property(x => x.CustomerId).HasColumnName("customer_id");
builder.Property(x => x.ValidSince).HasColumnName("valid_since");
builder.Property(x => x.Address).HasColumnName("address");
}
}
I want the navigation property on DbCustomer to expand according to the the following logic
SELECT *
FROM identities ident
INNER JOIN customer_addresses addr ON (ident.id = addr.customer_id)
AND (addr.valid_since = (SELECT tmp.valid_since
FROM customer_addresses tmp
WHERE ident.id = tmp.customer_id
ORDER BY tmp.valid_since DESC
LIMIT 1)
How can I express that in EF Core?