From 5bb7410e5052d738bafdfdbd9482323189f51ec4 Mon Sep 17 00:00:00 2001 From: Engincan VESKE Date: Mon, 1 Nov 2021 09:17:26 +0300 Subject: [PATCH] Create post for "Many-to-many relationship" article --- .../POST.md | 217 ++++++++++++++++++ .../domain-entity-structure.png | Bin 0 -> 23863 bytes .../er-diagram.png | Bin 0 -> 18231 bytes 3 files changed, 217 insertions(+) create mode 100644 docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/POST.md create mode 100644 docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/domain-entity-structure.png create mode 100644 docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/er-diagram.png diff --git a/docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/POST.md b/docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/POST.md new file mode 100644 index 0000000000..3e5f24d15c --- /dev/null +++ b/docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/POST.md @@ -0,0 +1,217 @@ +# Many to Many Relationship with ABP and EF Core + +## Introduction + +In this article, we'll create a **BookStore** application like in [the ABP tutorial](https://docs.abp.io/en/abp/latest/Tutorials/Part-1?UI=MVC&DB=EF) and add an extra `Category` feature to demonstrate how we can manage the many-to-many relationship with ABP-based applications (by following DDD rules). + +You can see the ER Diagram of our application under below. This diagram will be helpful for us to demonstrate the relations between our entities. + +![ER-Diagram](./er-diagram.png) + +When we've examined the ER Diagram, we can see the one-to-many relationship between **Author** and **Book** tables and also the many-to-many relationship (**BookCategory** table) between **Book** and **Category** tables. Cause, there can be more than one category on each book and vice-versa in our scenario. + +### Source Code + +You can find the source code of the application at https://github.com/EngincanV/ABP-Many-to-Many-Relationship-Demo . +## Creating the Solution + +In this article, I will create a new startup template with EF Core as a database provider and MVC for UI framework. + +* We can create a new startup template by using [ABP CLI](https://docs.abp.io/en/abp/latest/CLI): + +```bash +abp new BookStore -t app --version 5.0.0-beta.2 +``` + +* Our project boilerplate will be ready after the download is finished. Then, we can open the solution and starts to the development. + +## Starting the Development + +Let's start with creating our Domain Entities. + +### Step 1 - (Creating the Domain Entities) + +We can create a folder-structure under the `BookStore.Domain` project like in the below image. + +![Domain-Layer-Folder-Structure](./domain-entity-structure.png) + +Open the entity classes and add the following codes to each of these classes. + +* **Author.cs** + +```csharp +using System; +using JetBrains.Annotations; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; + +namespace BookStore.Authors +{ + public class Author : FullAuditedAggregateRoot + { + public string Name { get; private set; } + + public DateTime BirthDate { get; set; } + + public string ShortBio { get; set; } + + /* This constructor is for deserialization / ORM purpose */ + private Author() + { + } + + public Author(Guid id, [NotNull] string name, DateTime birthDate, [CanBeNull] string shortBio = null) + : base(id) + { + SetName(name); + BirthDate = birthDate; + ShortBio = shortBio; + } + + public void SetName([NotNull] string name) + { + Name = Check.NotNullOrWhiteSpace( + name, + nameof(name), + maxLength: AuthorConsts.MaxNameLength + ); + } + } +} +``` + +> We'll create the `AuthorConsts` class later in this step. + +* **Book.cs** + +```csharp +using System; +using Volo.Abp.Domain.Entities.Auditing; + +namespace BookStore.Books +{ + public class Book : FullAuditedAggregateRoot + { + public Guid AuthorId { get; set; } + + public string Name { get; set; } + + public BookType Type { get; set; } + + public DateTime PublishDate { get; set; } + + public float Price { get; set; } + + /* This constructor is for deserialization / ORM purpose */ + private Book() + { + } + + public Book(Guid id, Guid authorId, string name, BookType type, DateTime publishDate, float price) + : base(id) + { + AuthorId = authorId; + Name = name; + Type = type; + PublishDate = publishDate; + Price = price; + } + } +} +``` + +> We'll create the `BookType` enum later in this step. + +* **Category.cs** + +```csharp +using System; +using Volo.Abp; +using Volo.Abp.Domain.Entities.Auditing; + +namespace BookStore.Categories +{ + public class Category : AuditedAggregateRoot + { + public string Name { get; private set; } + + public bool IsActive { get; set; } + + /* This constructor is for deserialization / ORM purpose */ + private Category() + { + } + + public Category(Guid id, string name, bool isActive = true) : base(id) + { + SetName(name); + IsActive = isActive; + } + + public Category SetName(string name) + { + Name = Check.NotNullOrWhiteSpace(name, nameof(name), BookConsts.MaxNameLength); + return this; + } + } +} +``` + +> We'll create the `BookConsts` class later in this step. + +* **BookCategory.cs** + +```csharp +using System; +using Volo.Abp.Domain.Entities; + +namespace BookStore.Books +{ + public class BookCategory : Entity + { + public Guid BookId { get; protected set; } + + public Guid CategoryId { get; protected set; } + + private BookCategory() + { + } + + public BookCategory(Guid bookId, Guid categoryId) + { + BookId = bookId; + CategoryId = categoryId; + } + + public override object[] GetKeys() + { + return new object[] {BookId, CategoryId}; + } + } +} +``` + +Here, as you can notice we've defined the `BookCategory` as the **Join Table** for our many-to-many relationship and ensure the required properties (BookId and CategoryId) must be set to create this object. + +And also we've derived this class from `Entity` class and therefore we've had to override the **GetKeys** method of this class to define **Composite Key** + +> The composite key is composed of `BookId` and `CategoryId` in our case. + +> For more information about **Entities with Composite Keys**, you can read the relavant section from [Entites documentation](https://docs.abp.io/en/abp/latest/Entities#entities-with-composite-keys) + + + +* After defining our entities, now we can open the `BookStore.Domain.Shared` project and add the relevant constants and enums from there. + +* + +### Step 2 - (Database Integration) + + +--- + +* Create the Domain Entities ✓ +* Database Integration ✓ +* Db migration ✓ +* app services (category -> crud app service) +* ui \ No newline at end of file diff --git a/docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/domain-entity-structure.png b/docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/domain-entity-structure.png new file mode 100644 index 0000000000000000000000000000000000000000..496483ef1bba704db89d50c130600efb92ec2abc GIT binary patch literal 23863 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 literal 0 HcmV?d00001 diff --git a/docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/er-diagram.png b/docs/en/Community-Articles/2021-10-31-Many-to-Many-Relationship-with-ABP-and-EF-Core/er-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..5948366e0eead8d489df3371c99487e25623e07d GIT binary patch literal 18231 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 literal 0 HcmV?d00001