Browse Source

Merge branch 'dev' into maliming/Apply-Entity-Extension-System-for-samples

pull/3366/head
maliming 7 years ago
parent
commit
2b4265fdda
  1. 1
      common.DotSettings
  2. 11
      docs/zh-Hans/Customizing-Application-Modules-Extending-Entities.md
  3. 2
      docs/zh-Hans/Entities.md
  4. 13
      docs/zh-Hans/Entity-Framework-Core-Migrations.md
  5. 41
      docs/zh-Hans/Entity-Framework-Core.md
  6. 3
      docs/zh-Hans/Getting-Started-Angular-Template.md
  7. 6
      docs/zh-Hans/Getting-Started-With-Startup-Templates.md
  8. 10
      docs/zh-Hans/Startup-Templates/Application.md
  9. 1
      docs/zh-Hans/docs-nav.json
  10. 3
      framework/src/Volo.Abp.AutoMapper/AutoMapper/AbpAutoMapperExtensibleDtoExtensions.cs
  11. 1
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/ITenantAppService.cs
  12. 8
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateDto.cs
  13. 3
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateOrUpdateDtoBase.cs
  14. 2
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantDto.cs
  15. 3
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationAutoMapperProfile.cs
  16. 14
      modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs
  17. 5
      modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/Tenant.cs
  18. 12
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebAutoMapperProfile.cs
  19. 1
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs
  20. 1
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/CreateModal.cshtml.cs
  21. 1
      modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml.cs
  22. 6
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs
  23. 11
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/ObjectExtending/MyProjectNameDomainObjectExtensions.cs
  24. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Users/AppUser.cs
  25. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/MyProjectNameMigrationsDbContextFactory.cs
  26. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContext.cs
  27. 7
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs
  28. 2
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreModule.cs
  29. 5
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDb/MyProjectNameMongoDbModule.cs
  30. 1
      templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs

1
common.DotSettings

@ -20,4 +20,5 @@
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Async/@EntryIndexedValue">False</s:String> <s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Async/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Mutable/@EntryIndexedValue">False</s:String> <s:String x:Key="/Default/CodeStyle/Generate/=Overrides/Options/=Mutable/@EntryIndexedValue">False</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=SQL/@EntryIndexedValue">SQL</s:String>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Volo/@EntryIndexedValue">True</s:Boolean>
</wpf:ResourceDictionary> </wpf:ResourceDictionary>

11
docs/zh-Hans/Customizing-Application-Modules-Extending-Entities.md

@ -37,13 +37,14 @@ return user.GetProperty<string>("Title");
为了解决上面的问题,用于EF Core的ABP框架实体扩展系统允许你使用上面定义相同的额外属性API,但将所需的属性存储在单独的数据库表字段中. 为了解决上面的问题,用于EF Core的ABP框架实体扩展系统允许你使用上面定义相同的额外属性API,但将所需的属性存储在单独的数据库表字段中.
假设你想要添加 `SocialSecurityNumber` 到[身份模块](Modules/Identity.md)的 `IdentityUser` 实体. 你可以使用 `EntityExtensionManager` 静态类: 假设你想要添加 `SocialSecurityNumber` 到[身份模块](Modules/Identity.md)的 `IdentityUser` 实体. 你可以使用 `ObjectExtensionManager` 类:
````csharp ````csharp
EntityExtensionManager.AddProperty<IdentityUser, string>( ObjectExtensionManager.Instance
"SocialSecurityNumber", .MapEfCoreProperty<IdentityUser, string>(
b => { b.HasMaxLength(32); } "SocialSecurityNumber",
); b => { b.HasMaxLength(32); }
);
```` ````
* 你提供了 `IdentityUser` 作为实体名(泛型参数), `string` 做为新属性的类型, `SocialSecurityNumber` 做为属性名(也是数据库表的字段名). * 你提供了 `IdentityUser` 作为实体名(泛型参数), `string` 做为新属性的类型, `SocialSecurityNumber` 做为属性名(也是数据库表的字段名).

2
docs/zh-Hans/Entities.md

@ -367,7 +367,7 @@ public static class IdentityUserExtensions
* 对于 [Entity Framework Core](Entity-Framework-Core.md),这是两种类型的配置; * 对于 [Entity Framework Core](Entity-Framework-Core.md),这是两种类型的配置;
* 默认它以 `JSON` 字符串形式存储在 `ExtraProperties` 字段中. 序列化到 `JSON` 和反序列化到 `JSON` 由ABP使用EF Core的[值转换](https://docs.microsoft.com/zh-cn/ef/core/modeling/value-conversions)系统自动完成. * 默认它以 `JSON` 字符串形式存储在 `ExtraProperties` 字段中. 序列化到 `JSON` 和反序列化到 `JSON` 由ABP使用EF Core的[值转换](https://docs.microsoft.com/zh-cn/ef/core/modeling/value-conversions)系统自动完成.
* 如果需要,你可以使用 `EntityExtensionManager` 为所需的额外属性定义一个单独的数据库字段. 那些使用 `EntityExtensionManager` 配置的属性继续使用单个 `JSON` 字段. 当你使用预构建的[应用模块](Modules/Index.md)并且想要[扩展模块的实体](Customizing-Application-Modules-Extending-Entities.md). 参阅[EF Core迁移文档](Entity-Framework-Core.md)了解如何使用 `EntityExtensionManager`. * 如果需要,你可以使用 `ObjectExtensionManager` 为所需的额外属性定义一个单独的数据库字段. 那些使用 `ObjectExtensionManager` 配置的属性继续使用单个 `JSON` 字段. 当你使用预构建的[应用模块](Modules/Index.md)并且想要[扩展模块的实体](Customizing-Application-Modules-Extending-Entities.md). 参阅[EF Core迁移文档](Entity-Framework-Core.md)了解如何使用 `ObjectExtensionManager`.
* 对于 [MongoDB](MongoDB.md), 它以 **常规字段** 存储, 因为 MongoDB 天生支持这种 [额外](https://mongodb.github.io/mongo-csharp-driver/1.11/serialization/#supporting-extra-elements) 系统. * 对于 [MongoDB](MongoDB.md), 它以 **常规字段** 存储, 因为 MongoDB 天生支持这种 [额外](https://mongodb.github.io/mongo-csharp-driver/1.11/serialization/#supporting-extra-elements) 系统.
### 讨论额外的属性 ### 讨论额外的属性

13
docs/zh-Hans/Entity-Framework-Core-Migrations.md

@ -411,10 +411,11 @@ public static class MyProjectNameEntityExtensions
{ {
OneTimeRunner.Run(() => OneTimeRunner.Run(() =>
{ {
EntityExtensionManager.AddProperty<IdentityRole, string>( ObjectExtensionManager.Instance
"Title", .MapEfCoreProperty<IdentityRole, string>(
b => { b.HasMaxLength(128); } "Title",
); builder => { builder.HasMaxLength(64); }
);
}); });
} }
} }
@ -422,7 +423,7 @@ public static class MyProjectNameEntityExtensions
> 我们建议使用 `nameof(AppRole.Title)` 而不是硬编码 "Title" 字符串 > 我们建议使用 `nameof(AppRole.Title)` 而不是硬编码 "Title" 字符串
`EntityExtensionManager` 用于添加属性到现有的实体. 由于 `EntityExtensionManager` 是静态的,因此应调用一次. `OneTimeRunner` 是ABP框架定义简单的工具类. `ObjectExtensionManager` 用于添加属性到现有的实体. 由于 `ObjectExtensionManager.Instance` 是静态实例(单例),因此应调用一次. `OneTimeRunner` 是ABP框架定义简单的工具类.
参阅[EF Core集成文档](Entity-Framework-Core.md)了解更多关于实体扩展系统. 参阅[EF Core集成文档](Entity-Framework-Core.md)了解更多关于实体扩展系统.
@ -547,7 +548,7 @@ public class IdentityRoleExtendingService : ITransientDependency
实体扩展系统解决了额外属性主要的问题: 它可以将额外属性做为**标准表字段**存储到数据库. 实体扩展系统解决了额外属性主要的问题: 它可以将额外属性做为**标准表字段**存储到数据库.
你需要做的就是如上所诉使用 `EntityExtensionManager` 定义额外属性, 然后你就可以使得 `GetProperty` 和 `SetProperty` 方法对实体的属性进行get/set,但是这时它存储在数据库表的单独字段中. 你需要做的就是如上所诉使用 `ObjectExtensionManager` 定义额外属性, 然后你就可以使得 `GetProperty` 和 `SetProperty` 方法对实体的属性进行get/set,但是这时它存储在数据库表的单独字段中.
###### 创建新表 ###### 创建新表

41
docs/zh-Hans/Entity-Framework-Core.md

@ -298,56 +298,57 @@ public class BookService
> 要点: 你必须在使用`DbContext`的项目里引用`Volo.Abp.EntityFrameworkCore`包. 这会破坏封装,但在这种情况下,这就是你需要的. > 要点: 你必须在使用`DbContext`的项目里引用`Volo.Abp.EntityFrameworkCore`包. 这会破坏封装,但在这种情况下,这就是你需要的.
## Extra Properties & Entity Extension Manager ## Extra Properties & Object Extension Manager
额外属性系统允许你为实现了 `IHasExtraProperties` 的实体set/get动态属性. 当你想将自定义属性添加到[应用程序模块](Modules/Index.md)中定义的实体时,它特别有用. 额外属性系统允许你为实现了 `IHasExtraProperties` 的实体set/get动态属性. 当你想将自定义属性添加到[应用程序模块](Modules/Index.md)中定义的实体时,它特别有用.
默认,实体的所有额外属性存储在数据库的一个 `JSON` 对象中. 实体扩展系统允许你存储额外属性在数据库的单独字段中. 默认,实体的所有额外属性存储在数据库的一个 `JSON` 对象中.
有关额外属性和实体扩展系统的更多信息,请参阅下列文档: 实体扩展系统允许你存储额外属性在数据库的单独字段中. 有关额外属性和实体扩展系统的更多信息,请参阅下列文档:
* [自定义应用模块: 扩展实体](Customizing-Application-Modules-Extending-Entities.md) * [自定义应用模块: 扩展实体](Customizing-Application-Modules-Extending-Entities.md)
* [实体](Entities.md) * [实体](Entities.md)
本节只解释了 `EntityExtensionManager` 及其用法. 本节只解释了 EF Core相关的 `ObjectExtensionManager` 及其用法.
### AddProperty 方法 ### ObjectExtensionManager.Instance
`EntityExtensionManager` 的 `AddProperty` 方法允许你实体定义附加的属性. `ObjectExtensionManager` 实现单例模式,因此你需要使用静态的 `ObjectExtensionManager.Instance` 来执行所有操作。
### MapEfCoreProperty
`MapEfCoreProperty` 是一种快捷扩展方法,用于定义实体的扩展属性并映射到数据库.
**示例**: 添加 `Title` 属性 (数据库字段)到 `IdentityRole` 实体: **示例**: 添加 `Title` 属性 (数据库字段)到 `IdentityRole` 实体:
````csharp ````csharp
EntityExtensionManager.AddProperty<IdentityRole, string>( ObjectExtensionManager.Instance
"Title", .MapEfCoreProperty<IdentityRole, string>(
b => { b.HasMaxLength(128); } "Title",
); builder => { builder.HasMaxLength(64); }
);
```` ````
如果相关模块已实现此功能(通过使用下面说明的 `ConfigureExtensions`)则将新属性添加到模型中. 然后你需要运行标准的 `Add-Migration` 和 `Update-Database` 命令更新数据库以添加新字段. 如果相关模块已实现此功能(通过使用下面说明的 `ConfigureEfCoreEntity`)则将新属性添加到模型中. 然后你需要运行标准的 `Add-Migration` 和 `Update-Database` 命令更新数据库以添加新字段.
>`AddProperty` 方法必须在使用相关的 `DbContext` 之前调用,它是一个静态方法. 最好的方法是尽早的应用程序中使用它. 应用程序启动模板含有 `YourProjectNameEntityExtensions` 类,可以在放心的在此类中使用此方法. >`MapEfCoreProperty` 方法必须在使用相关的 `DbContext` 之前调用,它是一个静态方法. 最好的方法是尽早的应用程序中使用它. 应用程序启动模板含有 `YourProjectNameEntityExtensions` 类,可以在放心的在此类中使用此方法.
### ConfigureExtensions ### ConfigureEfCoreEntity
如果你正在开发一个可重用使用的模块,并允许应用程序开发人员将属性添加到你的实体,你可以在实体映射使用 `ConfigureExtensions` 扩展方法: 如果你正在开发一个可重用使用的模块,并允许应用程序开发人员将属性添加到你的实体,你可以在实体映射使用 `ConfigureEfCoreEntity` 扩展方法,但是在配置实体映射时可以使用快捷的扩展方法 `ConfigureObjectExtensions`:
````csharp ````csharp
builder.Entity<YourEntity>(b => builder.Entity<YourEntity>(b =>
{ {
b.ConfigureExtensions(); b.ConfigureObjectExtensions();
//... //...
}); });
```` ````
如果你调用 `ConfigureByConvention()` 扩展方法(在此示例中 `b.ConfigureByConvention`),ABP框架内部会调用 `ConfigureExtensions` 方法. 使用 `ConfigureByConvention` 方法是**最佳实践**,因为它还按照约定配置基本属性的数据库映射. 如果你调用 `ConfigureByConvention()` 扩展方法(在此示例中 `b.ConfigureByConvention`),ABP框架内部会调用 `ConfigureObjectExtensions` 方法. 使用 `ConfigureByConvention` 方法是**最佳实践**,因为它还按照约定配置基本属性的数据库映射.
参阅上面提到的 "*ConfigureByConvention 方法*" 了解更多信息. 参阅上面提到的 "*ConfigureByConvention 方法*" 了解更多信息.
### GetPropertyNames
`EntityExtensionManager.GetPropertyNames` 静态方法可以用作为此实体定义的扩展属性的名称. 应用程序代码通常不需要,但是ABP框架在内部使用它.
## 高级主题 ## 高级主题
### 设置默认仓储类 ### 设置默认仓储类

3
docs/zh-Hans/Getting-Started-Angular-Template.md

@ -0,0 +1,3 @@
## Getting Started With the Angular Application Template
TODO...

6
docs/zh-Hans/Getting-Started-With-Startup-Templates.md

@ -0,0 +1,6 @@
# 启动模板入门
参阅下面的教程来学习如何开始使用的ABP框架预构建的应用程序启动模板:
* [ASP.NET Core MVC/Razor页面模板入门](Getting-Started-AspNetCore-MVC-Template.md)
* [Angular UI模板入门](Getting-Started-Angular-Template.md)

10
docs/zh-Hans/Startup-Templates/Application.md

@ -2,11 +2,16 @@
## 介绍 ## 介绍
应用程序启动模板是基于[领域驱动设计](../Domain-Driven-Design.md)(DDD)分层的应用程序结构. 在这篇文档中详细介绍了解决方案结构和项目,如果你想快速入门,请遵循以下指南: 应用程序启动模板是基于[领域驱动设计](../Domain-Driven-Design.md)(DDD)分层的应用程序结构.
* 参阅[ASP.NET Core MVC 模板入门](../Getting-Started-AspNetCore-MVC-Template.md)创建此模板的新解决方案并运行它. 在这篇文档中详细介绍了**解决方案结构**和项目,如果你想快速入门,请遵循以下指南:
* 参阅[ASP.NET Core MVC 模板入门](../Getting-Started-With-Startup-Templates.md)创建此模板的新解决方案并运行它.
* 参阅[ASP.NET Core MVC 教程](../Tutorials/AspNetCore-Mvc/Part-I.md)学习使用此模板开发应用程序. * 参阅[ASP.NET Core MVC 教程](../Tutorials/AspNetCore-Mvc/Part-I.md)学习使用此模板开发应用程序.
* [入门文档](../Getting-Started-AspNetCore-MVC-Template.md) 介绍了如何在几分钟内创建一个新的应用程序.
* [应用程序开发教程](../Tutorials/AspNetCore-Mvc/Part-I.md) 学习使用此模板开发应用程序.
## 如何开始 ## 如何开始
你可以使用[ABP CLI](../CLI.md)创建基于此启动模板的新项目,或者你也可以在[入门](https://abp.io/get-started)页面创建并下载项目. 在这里我们使用CLI创建新项目. 你可以使用[ABP CLI](../CLI.md)创建基于此启动模板的新项目,或者你也可以在[入门](https://abp.io/get-started)页面创建并下载项目. 在这里我们使用CLI创建新项目.
@ -120,6 +125,7 @@ ABP是一个模块化的框架,理想的设计是让每个模块都有自己的
* 它依赖 `.EntityFrameworkCore` 项目,因为它重用了应用程序的 `DbContext` 配置 . * 它依赖 `.EntityFrameworkCore` 项目,因为它重用了应用程序的 `DbContext` 配置 .
> 只有在你使用了EF Core做为数据库提供程序时,此项目才会可用. > 只有在你使用了EF Core做为数据库提供程序时,此项目才会可用.
> 参阅[Entity Framework Core迁移指南](../Entity-Framework-Core-Migrations.md)了解这个项目的详细信息.
#### .DbMigrator 项目 #### .DbMigrator 项目

1
docs/zh-Hans/docs-nav.json

@ -5,6 +5,7 @@
"items": [ "items": [
{ {
"text": "从启动模板开始", "text": "从启动模板开始",
"path": "Getting-Started-With-Startup-Templates.md",
"items": [ "items": [
{ {
"text": "ASP.NET Core MVC 模板", "text": "ASP.NET Core MVC 模板",

3
framework/src/Volo.Abp.AutoMapper/AutoMapper/AbpAutoMapperExtensibleDtoExtensions.cs

@ -25,7 +25,8 @@ namespace AutoMapper
HasExtraPropertiesObjectExtendingExtensions HasExtraPropertiesObjectExtendingExtensions
.MapExtraPropertiesTo<TSource, TDestination>( .MapExtraPropertiesTo<TSource, TDestination>(
source.ExtraProperties, source.ExtraProperties,
result result,
definitionChecks
); );
return result; return result;

1
modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/ITenantAppService.cs

@ -11,6 +11,5 @@ namespace Volo.Abp.TenantManagement
Task UpdateDefaultConnectionStringAsync(Guid id, string defaultConnectionString); Task UpdateDefaultConnectionStringAsync(Guid id, string defaultConnectionString);
Task DeleteDefaultConnectionStringAsync(Guid id); Task DeleteDefaultConnectionStringAsync(Guid id);
} }
} }

8
modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateDto.cs

@ -1,9 +1,4 @@
using System.Collections.Generic; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using Volo.Abp.TenantManagement.Localization;
namespace Volo.Abp.TenantManagement namespace Volo.Abp.TenantManagement
{ {
@ -14,7 +9,6 @@ namespace Volo.Abp.TenantManagement
[MaxLength(256)] [MaxLength(256)]
public string AdminEmailAddress { get; set; } public string AdminEmailAddress { get; set; }
[Required] [Required]
[MaxLength(128)] [MaxLength(128)]
public string AdminPassword { get; set; } public string AdminPassword { get; set; }

3
modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantCreateOrUpdateDtoBase.cs

@ -1,8 +1,9 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.ObjectExtending;
namespace Volo.Abp.TenantManagement namespace Volo.Abp.TenantManagement
{ {
public abstract class TenantCreateOrUpdateDtoBase public abstract class TenantCreateOrUpdateDtoBase : ExtensibleObject
{ {
[Required] [Required]
[StringLength(TenantConsts.MaxNameLength)] [StringLength(TenantConsts.MaxNameLength)]

2
modules/tenant-management/src/Volo.Abp.TenantManagement.Application.Contracts/Volo/Abp/TenantManagement/TenantDto.cs

@ -3,7 +3,7 @@ using Volo.Abp.Application.Dtos;
namespace Volo.Abp.TenantManagement namespace Volo.Abp.TenantManagement
{ {
public class TenantDto : EntityDto<Guid> public class TenantDto : ExtensibleEntityDto<Guid>
{ {
public string Name { get; set; } public string Name { get; set; }
} }

3
modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/AbpTenantManagementApplicationAutoMapperProfile.cs

@ -6,7 +6,8 @@ namespace Volo.Abp.TenantManagement
{ {
public AbpTenantManagementApplicationAutoMapperProfile() public AbpTenantManagementApplicationAutoMapperProfile()
{ {
CreateMap<Tenant, TenantDto>(); CreateMap<Tenant, TenantDto>()
.MapExtraProperties();
} }
} }
} }

14
modules/tenant-management/src/Volo.Abp.TenantManagement.Application/Volo/Abp/TenantManagement/TenantAppService.cs

@ -4,6 +4,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.ObjectExtending;
namespace Volo.Abp.TenantManagement namespace Volo.Abp.TenantManagement
{ {
@ -27,13 +28,19 @@ namespace Volo.Abp.TenantManagement
public virtual async Task<TenantDto> GetAsync(Guid id) public virtual async Task<TenantDto> GetAsync(Guid id)
{ {
return ObjectMapper.Map<Tenant, TenantDto>( return ObjectMapper.Map<Tenant, TenantDto>(
await TenantRepository.GetAsync(id)); await TenantRepository.GetAsync(id)
);
} }
public virtual async Task<PagedResultDto<TenantDto>> GetListAsync(GetTenantsInput input) public virtual async Task<PagedResultDto<TenantDto>> GetListAsync(GetTenantsInput input)
{ {
var count = await TenantRepository.GetCountAsync(input.Filter); var count = await TenantRepository.GetCountAsync(input.Filter);
var list = await TenantRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount, input.Filter); var list = await TenantRepository.GetListAsync(
input.Sorting,
input.MaxResultCount,
input.SkipCount,
input.Filter
);
return new PagedResultDto<TenantDto>( return new PagedResultDto<TenantDto>(
count, count,
@ -45,6 +52,8 @@ namespace Volo.Abp.TenantManagement
public virtual async Task<TenantDto> CreateAsync(TenantCreateDto input) public virtual async Task<TenantDto> CreateAsync(TenantCreateDto input)
{ {
var tenant = await TenantManager.CreateAsync(input.Name); var tenant = await TenantManager.CreateAsync(input.Name);
input.MapExtraPropertiesTo(tenant);
await TenantRepository.InsertAsync(tenant); await TenantRepository.InsertAsync(tenant);
using (CurrentTenant.Change(tenant.Id, tenant.Name)) using (CurrentTenant.Change(tenant.Id, tenant.Name))
@ -66,6 +75,7 @@ namespace Volo.Abp.TenantManagement
{ {
var tenant = await TenantRepository.GetAsync(id); var tenant = await TenantRepository.GetAsync(id);
await TenantManager.ChangeNameAsync(tenant, input.Name); await TenantManager.ChangeNameAsync(tenant, input.Name);
input.MapExtraPropertiesTo(tenant);
await TenantRepository.UpdateAsync(tenant); await TenantRepository.UpdateAsync(tenant);
return ObjectMapper.Map<Tenant, TenantDto>(tenant); return ObjectMapper.Map<Tenant, TenantDto>(tenant);
} }

5
modules/tenant-management/src/Volo.Abp.TenantManagement.Domain/Volo/Abp/TenantManagement/Tenant.cs

@ -14,16 +14,15 @@ namespace Volo.Abp.TenantManagement
protected Tenant() protected Tenant()
{ {
ExtraProperties = new Dictionary<string, object>();
} }
protected internal Tenant(Guid id, [NotNull] string name) protected internal Tenant(Guid id, [NotNull] string name)
: base(id)
{ {
Id = id;
SetName(name); SetName(name);
ConnectionStrings = new List<TenantConnectionString>(); ConnectionStrings = new List<TenantConnectionString>();
ExtraProperties = new Dictionary<string, object>();
} }
[CanBeNull] [CanBeNull]

12
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/AbpTenantManagementWebAutoMapperProfile.cs

@ -1,4 +1,5 @@
using AutoMapper; using AutoMapper;
using Volo.Abp.AutoMapper;
using Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants; using Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants;
namespace Volo.Abp.TenantManagement.Web namespace Volo.Abp.TenantManagement.Web
@ -6,20 +7,17 @@ namespace Volo.Abp.TenantManagement.Web
public class AbpTenantManagementWebAutoMapperProfile : Profile public class AbpTenantManagementWebAutoMapperProfile : Profile
{ {
public AbpTenantManagementWebAutoMapperProfile() public AbpTenantManagementWebAutoMapperProfile()
{
CreateRoleMappings();
}
protected virtual void CreateRoleMappings()
{ {
//List //List
CreateMap<TenantDto, EditModalModel.TenantInfoModel>(); CreateMap<TenantDto, EditModalModel.TenantInfoModel>();
//CreateModal //CreateModal
CreateMap<CreateModalModel.TenantInfoModel, TenantCreateDto>(); CreateMap<CreateModalModel.TenantInfoModel, TenantCreateDto>()
.Ignore(x => x.ExtraProperties);
//EditModal //EditModal
CreateMap<EditModalModel.TenantInfoModel, TenantUpdateDto>(); CreateMap<EditModalModel.TenantInfoModel, TenantUpdateDto>()
.Ignore(x => x.ExtraProperties);
} }
} }
} }

1
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/ConnectionStringsModal.cshtml.cs

@ -2,7 +2,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants
{ {

1
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/CreateModal.cshtml.cs

@ -1,7 +1,6 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants
{ {

1
modules/tenant-management/src/Volo.Abp.TenantManagement.Web/Pages/TenantManagement/Tenants/EditModal.cshtml.cs

@ -2,7 +2,6 @@ using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants namespace Volo.Abp.TenantManagement.Web.Pages.TenantManagement.Tenants
{ {

6
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/MyProjectNameDomainModule.cs

@ -1,4 +1,5 @@
using MyCompanyName.MyProjectName.MultiTenancy; using MyCompanyName.MyProjectName.MultiTenancy;
using MyCompanyName.MyProjectName.ObjectExtending;
using Volo.Abp.AuditLogging; using Volo.Abp.AuditLogging;
using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundJobs;
using Volo.Abp.FeatureManagement; using Volo.Abp.FeatureManagement;
@ -27,6 +28,11 @@ namespace MyCompanyName.MyProjectName
)] )]
public class MyProjectNameDomainModule : AbpModule public class MyProjectNameDomainModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context)
{
MyProjectNameDomainObjectExtensions.Configure();
}
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
Configure<AbpMultiTenancyOptions>(options => Configure<AbpMultiTenancyOptions>(options =>

11
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDb/MyProjectNameEntityExtensions.cs → templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/ObjectExtending/MyProjectNameDomainObjectExtensions.cs

@ -2,9 +2,9 @@
using Volo.Abp.ObjectExtending; using Volo.Abp.ObjectExtending;
using Volo.Abp.Threading; using Volo.Abp.Threading;
namespace MyCompanyName.MyProjectName.MongoDB namespace MyCompanyName.MyProjectName.ObjectExtending
{ {
public static class MyProjectNameEntityExtensions public static class MyProjectNameDomainObjectExtensions
{ {
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
@ -12,8 +12,11 @@ namespace MyCompanyName.MyProjectName.MongoDB
{ {
OneTimeRunner.Run(() => OneTimeRunner.Run(() =>
{ {
/* You can extension properties to entities /* You can configure extension properties to entities or other object types
* defined in the depended modules. * defined in the depended modules.
*
* If you are using EF Core and want to map the entity extension properties to new
* table fields in the database, then configure them in the MyProjectNameEfCoreEntityExtensionMappings
* *
* Example: * Example:
* *
@ -21,7 +24,7 @@ namespace MyCompanyName.MyProjectName.MongoDB
* .AddOrUpdateProperty<IdentityRole, string>("Title"); * .AddOrUpdateProperty<IdentityRole, string>("Title");
* *
* See the documentation for more: * See the documentation for more:
* https://docs.abp.io/en/abp/latest/Customizing-Application-Modules-Extending-Entities * https://docs.abp.io/en/abp/latest/Object-Extensions
*/ */
}); });
} }

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Domain/Users/AppUser.cs

@ -48,7 +48,7 @@ namespace MyCompanyName.MyProjectName.Users
* *
* 1. update MyProjectNameDbContext.OnModelCreating * 1. update MyProjectNameDbContext.OnModelCreating
* to configure the mapping for your new property * to configure the mapping for your new property
* 2. Update MyProjectNameEntityExtensions to extend the IdentityUser entity * 2. Update MyProjectNameEfCoreEntityExtensionMappings to extend the IdentityUser entity
* and add your new property to the migration. * and add your new property to the migration.
* 3. Use the Add-Migration to add a new database migration. * 3. Use the Add-Migration to add a new database migration.
* 4. Run the .DbMigrator project (or use the Update-Database command) to apply * 4. Run the .DbMigrator project (or use the Update-Database command) to apply

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations/EntityFrameworkCore/MyProjectNameMigrationsDbContextFactory.cs

@ -11,7 +11,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore
{ {
public MyProjectNameMigrationsDbContext CreateDbContext(string[] args) public MyProjectNameMigrationsDbContext CreateDbContext(string[] args)
{ {
MyProjectNameEntityExtensions.Configure(); MyProjectNameEfCoreEntityExtensionMappings.Configure();
var configuration = BuildConfiguration(); var configuration = BuildConfiguration();

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameDbContext.cs

@ -46,7 +46,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore
b.ConfigureAbpUser(); b.ConfigureAbpUser();
/* Configure mappings for your additional properties /* Configure mappings for your additional properties
* Also see the MyProjectNameEntityExtensions class * Also see the MyProjectNameEfCoreEntityExtensionMappings class
*/ */
}); });

7
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEntityExtensions.cs → templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEfCoreEntityExtensionMappings.cs

@ -4,7 +4,7 @@ using Volo.Abp.Threading;
namespace MyCompanyName.MyProjectName.EntityFrameworkCore namespace MyCompanyName.MyProjectName.EntityFrameworkCore
{ {
public static class MyProjectNameEntityExtensions public static class MyProjectNameEfCoreEntityExtensionMappings
{ {
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner(); private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
@ -15,6 +15,11 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore
/* You can configure entity extension properties for the /* You can configure entity extension properties for the
* entities defined in the used modules. * entities defined in the used modules.
* *
* The properties defined here becomes table fields.
* If you want to use the ExtraProperties dictionary of the entity
* instead of creating a new field, then define the property in the
* MyProjectNameDomainObjectExtensions class.
*
* Example: * Example:
* *
* ObjectExtensionManager.Instance * ObjectExtensionManager.Instance

2
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.EntityFrameworkCore/EntityFrameworkCore/MyProjectNameEntityFrameworkCoreModule.cs

@ -29,7 +29,7 @@ namespace MyCompanyName.MyProjectName.EntityFrameworkCore
{ {
public override void PreConfigureServices(ServiceConfigurationContext context) public override void PreConfigureServices(ServiceConfigurationContext context)
{ {
MyProjectNameEntityExtensions.Configure(); MyProjectNameEfCoreEntityExtensionMappings.Configure();
} }
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)

5
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.MongoDB/MongoDb/MyProjectNameMongoDbModule.cs

@ -24,11 +24,6 @@ namespace MyCompanyName.MyProjectName.MongoDB
)] )]
public class MyProjectNameMongoDbModule : AbpModule public class MyProjectNameMongoDbModule : AbpModule
{ {
public override void PreConfigureServices(ServiceConfigurationContext context)
{
MyProjectNameEntityExtensions.Configure();
}
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
context.Services.AddMongoDbContext<MyProjectNameMongoDbContext>(options => context.Services.AddMongoDbContext<MyProjectNameMongoDbContext>(options =>

1
templates/app/aspnet-core/src/MyCompanyName.MyProjectName.Web.Host/Program.cs

@ -17,6 +17,7 @@ namespace MyCompanyName.MyProjectName.Web
.MinimumLevel.Information() .MinimumLevel.Information()
#endif #endif
.MinimumLevel.Override("Microsoft", LogEventLevel.Information) .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
.MinimumLevel.Override("Microsoft.EntityFrameworkCore", LogEventLevel.Warning)
.Enrich.FromLogContext() .Enrich.FromLogContext()
.WriteTo.Async(c => c.File("Logs/logs.txt")) .WriteTo.Async(c => c.File("Logs/logs.txt"))
.CreateLogger(); .CreateLogger();

Loading…
Cancel
Save