Browse Source

part 2 implemented

pull/16016/head
Onur Pıçakcı 4 years ago
parent
commit
efaa784f38
  1. 153
      docs/en/Community-Articles/onur-article/Post.md
  2. BIN
      docs/en/Community-Articles/onur-article/images/database-tables.png
  3. BIN
      docs/en/Community-Articles/onur-article/images/open-terminal.png
  4. BIN
      docs/en/Community-Articles/onur-article/images/user-department.png
  5. BIN
      docs/en/Community-Articles/onur-article/images/users-page-department.png
  6. BIN
      docs/en/Community-Articles/onur-article/images/users-table.png

153
docs/en/Community-Articles/onur-article/Post.md

@ -53,7 +53,7 @@ public static void ConfigureExtraProperties()
});
}
```
> This method is called inside the YourProjectNameDomainSharedModule at the beginning of the application. OneTimeRunner is a utility class that guarantees to execute this code only one time per application, since multiple calls are unnecessary.
> This method is called inside the IdentityRelationshipDomainSharedModule at the beginning of the application. OneTimeRunner is a utility class that guarantees to execute this code only one time per application, since multiple calls are unnecessary.
If you want to localize, open the `IdentityRelationship.Domain.Shared` project and create a new localization in your `/Localization/IdentityRelationship/en.json` file.
@ -73,27 +73,154 @@ Once you define a property, it appears in the create and update forms of the rel
It is supported to add an extension property to an entity that is Id of another entity (foreign key).
### Example: Let's associate a department in the database with a user.
First create a `Departments` folder in the `IdentityRelationship.Domain` project and add the `Department` class inside.
```csharp
ObjectExtensionManager.Instance.Modules()
.ConfigureIdentity(identity =>
using System;
using Volo.Abp.Domain.Entities;
namespace IdentityRelationship.Departments;
public class Department : AggregateRoot<Guid>
{
public string Name { get; set; }
}
```
EF Core requires that you relate the entities with your DbContext. The easiest way to do so is adding a DbSet property to the IdentityRelationshipDbContext class in the IdentityRelationship.EntityFrameworkCore project, as shown below:
```csharp
public DbSet<Department> Departments { get; set; }
```
Then in the `IdentityRelationship.EntityFrameworkCore` project of your solution, open the `/EntityFrameworkCore/IdentityRelationshipEfCoreEntityExtensionMappings` class and update your code:
```csharp
public static class IdentityRelationshipEfCoreEntityExtensionMappings
{
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
public static void Configure()
{
identity.ConfigureUser(user =>
IdentityRelationshipGlobalFeatureConfigurator.Configure();
IdentityRelationshipModuleExtensionConfigurator.Configure();
OneTimeRunner.Run(() =>
{
user.AddOrUpdateProperty<Guid>(
"DepartmentId",
property =>
{
property.UI.Lookup.Url = "/api/app/departments";
property.UI.Lookup.DisplayPropertyName = "name";
}
);
ObjectExtensionManager.Instance
.MapEfCoreProperty<IdentityUser, Guid>(
"DepartmentId",
(entityBuilder, propertyBuilder) => { propertyBuilder.HasMaxLength(128); }
);
});
});
}
}
```
This class can be used to map these extra properties to table fields in the database. Please read [this](https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities?_ga=2.21022651.140118448.1679289046-1173891759.1672473062) article to improve your understanding of what we are doing.
We need to create a new migration to see the changes in the database. Open your EntityFrameworkCore project in the terminal (this depends on the IDE you are using).
![terminal-image](images/open-terminal.png)
```bash
dotnet ef migrations add Create_Department_Entity
```
Finally, run the `IdentityRelationship.DbMigrator` project to update the database.
When you look at your database, you can see that `Department` table has been added and `DepartmentId` has been added to your `AbpUsers` table.
![database-tables](images/database-tables.png)
![users-table](images/users-table.png)
Again open the `IdentityRelationshipModuleExtensionConfigurator` class in the Domain.Shared project and add the following code:
```csharp
user.AddOrUpdateProperty<Guid>(
"DepartmentId",
property =>
{
property.UI.Lookup.Url = "/api/app/departments";
property.UI.Lookup.DisplayPropertyName = "name";
}
);
```
`UI.Lookup.Url` option takes a URL to get list of departments to select on edit/create forms. This endpoint can be a typical controller, an auto API controller or any type of endpoint that returns a proper JSON response.
Create a `Departments` folder in the `IdentityRelationship.Application.Contracts` project of your solution and add the `DepartmentDto` class in it
```csharp
using System;
namespace IdentityRelationship.Departments;
public class DepartmentDto
{
public Guid Id { get; set; }
public string Name { get; set; }
}
```
Now let's create an `IDepartmentAppService`interface in the `Departments` folder
```csharp
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace IdentityRelationship.Departments;
public interface IDepartmentAppService : IApplicationService
{
public Task<ListResultDto<DepartmentDto>> GetAsync();
}
```
Time to implement the `IDepartmentAppService` interface. Create a `Departments` folder in your `IdentityRelationship.Application` project and add the `DepartmentAppService` class inside.
```csharp
using System;
using System.Threading.Tasks;
using IdentityRelationship.Departments;
using Volo.Abp.Application.Dtos;
namespace IdentityRelationship.Department;
public class DepartmentAppService : IdentityRelationshipAppService, IDepartmentAppService
{
public async Task<ListResultDto<DepartmentDto>> GetAsync()
{
return new ListResultDto<DepartmentDto>(
new[]
{
new DepartmentDto
{
Id = Guid.Parse("6267f0df-870f-4173-be44-d74b4b56d2bd"),
Name = "Human Resources"
},
new DepartmentDto
{
Id = Guid.Parse("21c7b61f-330c-489e-8b8c-80e0a78a5cc5"),
Name = "Production"
}
}
);
}
}
```
Run your `IdentityRelationship.Web` project and add a department to one of your users.
![user-department-image](images/user-department.png)
And shows the department name on the data table:
![users-page-department-image](images/users-page-department.png)

BIN
docs/en/Community-Articles/onur-article/images/database-tables.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

BIN
docs/en/Community-Articles/onur-article/images/open-terminal.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

BIN
docs/en/Community-Articles/onur-article/images/user-department.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
docs/en/Community-Articles/onur-article/images/users-page-department.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 178 KiB

BIN
docs/en/Community-Articles/onur-article/images/users-table.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 278 KiB

Loading…
Cancel
Save