πŸ› οΈ Task Checklist

Preparation

EF Core Code First

🚧 Branching

  • Create the develop branch
  • Create the feature/domain-entities branch based on develop

IEntity.cs

  • Create the IEntity interface πŸ“‚ Suggested Folder: Domain/Framework/Interfaces
public interface IEntity<TKey>
{
    public TKey Id { get; set; }
}

Entity.cs

  • Create the Entity class πŸ“‚ Suggested Folder: Domain/Framework/Base
public class Entity<TKey> : IEntity<TKey>
{
    public TKey Id{ get; set; }
}

Create Entities

πŸ“‚ Suggested Folder: Domain/Aggregates/[RelatedFolder] Entities represent the core business objects in our domain model. By defining them explicitly and consistently, we ensure that:

  • Our domain logic remains clear and maintainable.
  • We follow Domain-Driven Design (DDD) principles, keeping the business rules close to the data they govern.
  • All developers have a standardized structure to follow, improving code readability and collaboration.

Guidelines

  1. Base Class
    • All entities (except join tables) must inherit from Entity and explicitly specify the datatype of their Id.
  2. Properties
    • Use the latest version of the ERD to define properties and relationships.
  3. Reference Project
  4. ERD Reference
    • Latest ERD available here:
      πŸ‘‰ Project ERD One Example:

Example

public class Account : Entity<long>
{
    public required string PhoneNumber { get; set; }
    public required string Password { set; get; }
    public string? Email { get; set; }
    public long? PersonId { get; set; }
    //...
}

Add Navigation Properties

Navigation properties in Entity Framework Core (EF Core) represent relationships between entities. They allow you to navigate (follow) the relationships between different tables using C# objects instead of writing SQL joins manually.

Add the needed navigation properties inside entities

πŸ”Ή Examples of Defining Navigation Properties

These are just examples, and not how the project should look like

πŸ”Ή One-to-Many Example

A Buyer can have multiple Tickets, but each Ticket belongs to one Buyer.

public class Buyer
{
    public int Id { get; set; }
    public string Name { get; set; }
 
    // Navigation Property (One Buyer β†’ Many Tickets)
    public virtual ICollection<Ticket> Tickets { get; set; } = new List<Ticket>();
}
 
public class Ticket
{
    public int Id { get; set; }
    public int BuyerId { get; set; }
 
    // Navigation Property (Many Tickets β†’ One Buyer)
    public virtual Buyer Buyer { get; set; }
}

πŸ”Ή One-to-One Example

A Ticket can have only one Transaction, and a Transaction belongs to exactly one Ticket.

public class Ticket
{
    public int Id { get; set; }
 
    // One-to-One Navigation Property
    public virtual Transaction Transaction { get; set; }
}
 
public class Transaction
{
    public int Id { get; set; }
    public int TicketId { get; set; }
 
    // One-to-One Navigation Property
    public virtual Ticket Ticket { get; set; }
}

πŸ”Ή Many-to-Many Example

A Buyer can buy many Tickets, and each Ticket can be bought by many Buyers (if resale is allowed).

public class Buyer
{
    public int Id { get; set; }
    public string Name { get; set; }
 
    // Many-to-Many Navigation Property
    public virtual ICollection<Ticket> Tickets { get; set; } = new List<Ticket>();
}
 
public class Ticket
{
    public int Id { get; set; }
 
    // Many-to-Many Navigation Property
    public virtual ICollection<Buyer> Buyers { get; set; } = new List<Buyer>();
}

Add Packages to Infrastructure Project

  • Add Microsoft.EntityFrameworkCore.Proxies to Infrastructure Project

🚧 Merge

  • Create a PR and merge the current branch with develop

🧠 Hints & Notes

  • Mark navigation properties virtual

πŸ™Œ Acknowledgements

  • ChatGPT for snippet refinement and explanations

πŸ” References

Session01 Additional Info