Entity Relationships

User Id ExternalIdentityId Email CreatedAt Expenses Guid · PK string string DateTime ICollection<Expense> Category Id Name CreatedAt int · PK string DateTime Expense Id User UserId Category CategoryId Amount Description ExpenseDate CreatedAt UpdatedAt Guid · PK navigation Guid · FK navigation int · FK decimal string DateOnly DateTime DateTime one many one many
Fig. 01  ·  Three entities, two relationships
backend/src/Finance.Domain/Entities/User.cspublic class User
{
    public Guid Id { get; set; }
    public string ExternalIdentityId { get; set; } = null!;
    public string Email { get; set; } = null!;
    public DateTime CreatedAt { get; set; }

    public ICollection<Expense> Expenses { get; set; } = new List<Expense>();
}
backend/src/Finance.Domain/Entities/Category.cspublic class Category
{
    public int Id { get; set; }
    public string Name { get; set; } = null!;
    public DateTime CreatedAt { get; set; }
}
backend/src/Finance.Domain/Entities/Expense.cspublic class Expense
{
    public Guid Id { get; set; }
    public User User { get; set; } = null!;
    public Guid UserId { get; set; }
    public Category Category { get; set; } = null!;
    public int CategoryId { get; set; }
    public decimal Amount { get; set; }
    public string Description { get; set; } = null!;
    public DateOnly ExpenseDate { get; set; }
    public DateTime CreatedAt { get; set; }
    public DateTime UpdatedAt { get; set; }
}
backend/src/Finance.Domain/Entities/User.cs// The "one" side
public ICollection<Expense> Expenses { get; set; } = new List<Expense>();
backend/src/Finance.Domain/Entities/Expense.cs// The "many" side
public Guid UserId { get; set; }
public User User { get; set; } = null!;

Category is the "one" side, with no collection to reach its expenses.

backend/src/Finance.Domain/Entities/Expense.cs// The "many" side
public int CategoryId { get; set; }
public Category Category { get; set; } = null!;
Next Clean Architecture vs my design