π οΈ Task Checklist
Preparation
EF Core Code First
- Watch this video
π§ 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
- Base Class
- All entities (except join tables) must inherit from
Entity
and explicitly specify the datatype of theirId
.
- All entities (except join tables) must inherit from
- Properties
- Use the latest version of the ERD to define properties and relationships.
- Reference Project
- For implementation details, you can refer to this project:
π AlibabaClone-Backend Domain Layer
- For implementation details, you can refer to this project:
- ERD Reference
- Latest ERD available here:
π Project ERD One Example:
- Latest ERD available here:
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
- Figure out what navigation properties are needed based on the ERD, and use this project as a reference: https://github.com/MehrdadShirvani/AlibabaClone-Backend/tree/develop/AlibabaClone.Domain/Aggregates
- Donβt forget to mark all the navigation properties as
virtual
πΉ 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