From 0b74af6f900ba78b1635fbac98364e8ea3c37b6a Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 21 Feb 2020 12:08:27 +0800 Subject: [PATCH 01/22] introduce AlwaysAllowMethodInvocationAuthorizationService. Resolve #2874 --- .../AbpAuthorizationServiceCollectionExtensions.cs | 1 + ...lwaysAllowMethodInvocationAuthorizationService.cs | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AlwaysAllowMethodInvocationAuthorizationService.cs diff --git a/framework/src/Volo.Abp.Authorization/Microsoft/Extensions/DependencyInjection/AbpAuthorizationServiceCollectionExtensions.cs b/framework/src/Volo.Abp.Authorization/Microsoft/Extensions/DependencyInjection/AbpAuthorizationServiceCollectionExtensions.cs index 093c9f3884..1cd3f5a0b7 100644 --- a/framework/src/Volo.Abp.Authorization/Microsoft/Extensions/DependencyInjection/AbpAuthorizationServiceCollectionExtensions.cs +++ b/framework/src/Volo.Abp.Authorization/Microsoft/Extensions/DependencyInjection/AbpAuthorizationServiceCollectionExtensions.cs @@ -11,6 +11,7 @@ namespace Microsoft.Extensions.DependencyInjection { services.Replace(ServiceDescriptor.Singleton()); services.Replace(ServiceDescriptor.Singleton()); + services.Replace(ServiceDescriptor.Singleton()); return services.Replace(ServiceDescriptor.Singleton()); } } diff --git a/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AlwaysAllowMethodInvocationAuthorizationService.cs b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AlwaysAllowMethodInvocationAuthorizationService.cs new file mode 100644 index 0000000000..d4a30b56f5 --- /dev/null +++ b/framework/src/Volo.Abp.Authorization/Volo/Abp/Authorization/AlwaysAllowMethodInvocationAuthorizationService.cs @@ -0,0 +1,12 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Authorization +{ + public class AlwaysAllowMethodInvocationAuthorizationService : IMethodInvocationAuthorizationService + { + public Task CheckAsync(MethodInvocationAuthorizationContext context) + { + return Task.CompletedTask; + } + } +} \ No newline at end of file From a18b8201bf636e046452ffb3302da7b48e9b684b Mon Sep 17 00:00:00 2001 From: AkinCam <172804016@ogr.cbu.edu.tr> Date: Fri, 21 Feb 2020 10:38:45 +0300 Subject: [PATCH 02/22] Added some localization keys --- .../Commercial/Localization/Resources/en.json | 7 ++++--- .../Volo/Abp/Users/UserLookupService.cs | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json index 7987b9ab32..3df70437b4 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Commercial/Localization/Resources/en.json @@ -5,8 +5,9 @@ "OrganizationList": "Organization list", "Volo.AbpIo.Commercial:010003": "You are not owner of this organization!", "OrganizationNotFoundMessage": "No organization found!", - "DeveloperCount": "Developer count", - "QuestionCount": "Question count", + "DeveloperCount": "Allocated / total developers", + "QuestionCount": "Remaining / total questions", + "Unlimited": "Unlimited", "Owners": "Owners", "AddMember": "Add member", "AddOwner": "Add owner", @@ -30,5 +31,5 @@ "SuccessfullyAddedToNewsletter": "Thanks you for subscribing to our newsletter!", "ManageProfile": "Manage your profile", "EmailNotValid": "Please enter a valid email address." - } + } } \ No newline at end of file diff --git a/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs b/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs index 09979f00e1..d2a13d9ba4 100644 --- a/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs +++ b/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs @@ -32,7 +32,7 @@ namespace Volo.Abp.Users public async Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default) { - var localUser = await _userRepository.FindAsync(id, cancellationToken: cancellationToken); + var localUser = await _userRepository.FindAsync(id,cancellationToken: cancellationToken); if (ExternalUserLookupServiceProvider == null) { From 5644cbdb8965cef1c6496186c105aa7af9ca02b6 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 23 Feb 2020 22:56:21 +0800 Subject: [PATCH 03/22] Update entities doc --- docs/zh-Hans/Entities.md | 160 +++++++++++++++++++++++++++++++++------ 1 file changed, 138 insertions(+), 22 deletions(-) diff --git a/docs/zh-Hans/Entities.md b/docs/zh-Hans/Entities.md index 9c3066fef4..66ba94a0cd 100644 --- a/docs/zh-Hans/Entities.md +++ b/docs/zh-Hans/Entities.md @@ -1,34 +1,80 @@ -## 实体 +# 实体 实体是DDD(Domain Driven Design)中核心概念.Eric Evans是这样描述实体的 "一个没有从其属性,而是通过连续性和身份的线索来定义的对象" 实体通常映射到关系型数据库的表中. -### 实体类 +## 实体类 实体都继承自`Entity`类,如下所示: ```C# -public class Person : Entity +public class Book : Entity { public string Name { get; set; } - public DateTime CreationTime { get; set; } + public float Price { get; set; } +} +``` + +> 如果你不想继承基类`Entity`,也可以直接实现`IEntity`接口 + +`Entity`类只是用给定的主 **键类型** 定义了一个`Id`属性,在上面的示例中是`Guid`类型.可以是其他类型如`string`, `int`, `long`或其他你需要的类型. + +### Guid主键的实体 + +如果你的实体Id类型为 `Guid`,有一些好的实践可以实现: - public Person() +* 创建一个构造函数,获取ID作为参数传递给基类. + * 如果没有为GUID Id斌值,ABP框架会在保存时设置它,但是在将实体保存到数据库之前最好在实体上有一个有效的Id. +* 如果使用带参数的构造函数创建实体,那么还要创建一个 `protected` 构造函数. 当数据库提供程序从数据库读取你的实体时(反序列化时)将使用它. +* 不要使用 `Guid.NewGuid()` 来设置Id! 在创建实体的代码中使用[`IGuidGenerator`服务](Guid-Generation.md)传递Id参数. `IGuidGenerator`经过优化可以产生连续的GUID.这对于关系数据库中的聚集索引非常重要. + +示例实体: + +````csharp +public class Book : Entity +{ + public string Name { get; set; } + public float Price { get; set; } + protected Book() + { + } + public Book(Guid id) + : base(id) { - CreationTime = DateTime.Now; } } -``` +```` -> 如果你不想继承基类`Entity`,也可以直接实现`IEntity`接口 +在[应用服务](Application-Services.md)中使用示例: -`Entity`类只是用给定的主 **键类型** 定义了一个`Id`属性,在上面的示例中是`int`类型.可以是其他类型如`string`, `Guid`, `long`或其他你需要的类型. +````csharp +public class BookAppService : ApplicationService, IBookAppService +{ + private readonly IRepository _bookRepository; + public BookAppService(IRepository bookRepository) + { + _bookRepository = bookRepository; + } + public async Task CreateAsync(CreateBookDto input) + { + await _bookRepository.InsertAsync( + new Book(GuidGenerator.Create()) + { + Name = input.Name, + Price = input.Price + } + ); + } +} +```` -实体类还重写了 **equality** 运算符(==),以方便地检查两个实体是否相等(如果它们是相同的类型并且它们的Id相等,则它们是相等的). +* `BookAppService` 注入图书实体的默认[仓库](Repositories.md),使用`InsertAsync`方法插入 `Book` 到数据库中. +* `GuidGenerator`类型是 `IGuidGenerator`,它是在`ApplicationService`基类中定义的属性. ABP将这样常用属性预注入,所以不需要手动[注入](Dependency-Injection.md). +* 如果您想遵循DDD最佳实践,请参阅下面的*聚合示例*部分. -#### 具有复合键的实体 +### 具有复合键的实体 有些实体可能需要 **复合键** .在这种情况下,可以从非泛型`Entity`类派生实体.如: @@ -53,30 +99,30 @@ public class UserRole : Entity } ```` -上面的例子中,复合键由`UserId`和`RoleId`组成.在关系数据库中,它是相关表的复合主键. +上面的例子中,复合键由`UserId`和`RoleId`组成.在关系数据库中,它是相关表的复合主键. 具有复合键的实体应当实现上面代码中所示的`GetKeys()`方法. -具有复合键的实体应当实现上面代码中所示的`GetKeys()`方法. +> 你还需要在**对象关系映射**(ORM)中配置实体的键. 参阅[Entity Framework Core](Entity-Framework-Core.md)集成文档查看示例. -你还需要在 **object-to-relational mapping**(ORM)中配置实体的键. +> 需要注意,复合主键实体不可以使用 `IRepository` 接口,因为它需要一个唯一的Id属性. 但你可以使用 `IRepository`.更多信息请参见[仓储](Repositories.md)的文档. -> 复合主键在仓储中有限制.由于不知道Id属性,所以对于这些实体,不能使用`IRepository`.但是,可以使用`IRepository`.更多信息请参见[仓储](Repositories.md)的文档. - -### 聚合根 +## 聚合根 "*聚合是域驱动设计中的一种模式.DDD的聚合是一组可以作为一个单元处理的域对象.例如,订单及订单系列的商品,这些是独立的对象,但将订单(连同订单系列的商品)视为一个聚合通常是很有用的*"( [查看详细介绍](http://martinfowler.com/bliki/DDD_Aggregate.html)) -`AggregateRoot`类继承自`Entity`类,所以默认有`Id`这个属性 +`AggregateRoot`类继承自`Entity`类,所以默认有`Id`这个属性 > 值得注意的是 ABP 会默认为聚合根创建仓储,当然,ABP也可以为所有的实体创建仓储,详情参见[仓储](Repositories.md). -ABP不强制你使用聚合根,实际上你可以使用上面定义的`Entity`类,当然,如果你想实现DDD并且创建聚合根,这里有一些最佳实践仅供参考: +ABP不强制你使用聚合根,实际上你可以使用上面定义的`Entity`类,当然,如果你想实现[领域驱动设计](Domain-Driven-Design.md)并且创建聚合根,这里有一些最佳实践仅供参考: * 聚合根需要维护自身的完整性,所有的实体也是这样.但是聚合根也要维护子实体的完整性.所以,聚合根必须一直有效. * 使用Id引用聚合根,而不使用导航属性 * 聚合根被视为一个单元.它是作为一个单元检索和更新的.它通常被认为是一个交易边界. * 不单独修改聚合根中的子实体 -#### 聚合根例子 +如果你想在应用程序中实现DDD,请参阅[实体设计最佳实践指南](Best-Practices/Entities.md). + +### 聚合根例子 这是一个具有子实体集合的聚合根例子: @@ -155,6 +201,11 @@ public class OrderLine : Entity { Count = newCount; } + + public override object[] GetKeys() + { + return new Object[] {OrderId, ProductId}; + } } ```` @@ -169,8 +220,73 @@ public class OrderLine : Entity * `Order.AddProduct`实现了业务规则将商品添加到订单中 * 所有属性都有`protected`的set.这是为了防止实体在实体外部任意改变.因此,在没有向订单中添加新产品的情况下设置 `TotalItemCount`将是危险的.它的值由`AddProduct`方法维护. -ABP不强制你应用任何DDD规则或模式.但是,当你准备应用的DDD规则或模式时候,ABP会让这变的可能而且更简单.文档同样遵循这个原则. +ABP框架不强制你应用任何DDD规则或模式.但是,当你准备应用的DDD规则或模式时候,ABP会让这变的可能而且更简单.文档同样遵循这个原则. -#### 带有组合键的聚合根 +### 带有组合键的聚合根 虽然这种聚合根并不常见(也不建议使用),但实际上可以按照与上面提到的跟实体相同的方式定义复合键.在这种情况下,要使用非泛型的`AggregateRoot`基类. + +## 基类和接口的审计属性 + +有一些属性,像`CreationTime`,`CreatorId`,`LastModificationTime`...在所有应用中都很常见. ABP框架提供了一些接口和基类来**标准化**这些属性,并**自动设置它们的值**. + +### 审计接口 + +有很多的审计接口,你可以实现一个你需要的那个. + +> 虽然可以手动实现这些接口,但是可以使用下一节中定义的**基类**简化代码. + +* `IHasCreationTime` 定义了以下属性: + * `CreationTime` +* `IMayHaveCreator` 定义了以下属性: + * `CreatorId` +* `ICreationAuditedObject` 继承 `IHasCreationTime` 和 `IMayHaveCreator`, 所以它定义了以下属性: + * `CreationTime` + * `CreatorId` +* `IHasModificationTime` 定义了以下属性: + * `LastModificationTime` +* `IModificationAuditedObject` 扩展 `IHasModificationTime` 并添加了 `LastModifierId` 属性. 所以它定义了以下属性: + * `LastModificationTime` + * `LastModifierId` +* `IAuditedObject` 扩展 `ICreationAuditedObject` 和 `IModificationAuditedObject`, 所以它定义了以下属性: + * `CreationTime` + * `CreatorId` + * `LastModificationTime` + * `LastModifierId` +* `ISoftDelete` (参阅 [数据过滤文档](Data-Filtering.md)) 定义了以下属性: + * `IsDeleted` +* `IHasDeletionTime` 扩展 `ISoftDelete` 并添加了 `DeletionTime` 属性. 所以它定义了以下属性: + * `IsDeleted` + * `DeletionTime` +* `IDeletionAuditedObject` 扩展 `IHasDeletionTime` 并添加了 `DeleterId` 属性. 所以它定义了以下属性: + * `IsDeleted` + * `DeletionTime` + * `DeleterId` +* `IFullAuditedObject` 继承 `IAuditedObject` 和 `IDeletionAuditedObject`, 所以它定义了以下属性: + * `CreationTime` + * `CreatorId` + * `LastModificationTime` + * `LastModifierId` + * `IsDeleted` + * `DeletionTime` + * `DeleterId` + +当你实现了任意接口,或者从下一节定义的类派生,ABP框架就会尽可能地自动管理这些属性. + +> 实现 `ISoftDelete` , `IDeletionAuditedObject` 或 `IFullAuditedObject` 让你的实体**软删除**. 参阅[数据过滤文档](Data-Filtering.md),了解软删除模式. + +### 审计基类 + +虽然可以手动实现以上定义的任何接口,但建议从这里定义的基类继承: + +* `CreationAuditedEntity` 和 `CreationAuditedAggregateRoot` 实现了 `ICreationAuditedObject` 接口. +* `AuditedEntity` 和 `AuditedAggregateRoot` 实现了 `IAuditedObject` 接口. +* `FullAuditedEntity` and `FullAuditedAggregateRoot` 实现了 `IFullAuditedObject` 接口. + +所有这些基类都有非泛型版本,可以使用 `AuditedEntity` 和 `FullAuditedAggregateRoot` 来支持复合主键; + +所有这些基类也有 `... WithUser`,像 `FullAuditedAggregateRootWithUser` 和 `FullAuditedAggregateRootWithUser`. 这样就可以将导航属性添加到你的用户实体. 但在聚合根之间添加导航属性不是一个好做法,所以这种用法是不建议的(除非你使用EF Core之类的ORM可以很好地支持这种情况,并且你真的需要它. 请记住这种方法不适用于NoSQL数据库(如MongoDB),你必须真正实现聚合模式). + +## 另请参阅 + +* [实体设计最佳实践指南](Best-Practices/Entities.md) \ No newline at end of file From 570ff20382e27324ddba26aa78084e93c60b4f8c Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 24 Feb 2020 09:54:37 +0800 Subject: [PATCH 04/22] Update EfCoreAuditLogRepository.cs --- .../EntityFrameworkCore/EfCoreAuditLogRepository.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs index 094f946777..1a13b702b0 100644 --- a/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs +++ b/modules/audit-logging/src/Volo.Abp.AuditLogging.EntityFrameworkCore/Volo/Abp/AuditLogging/EntityFrameworkCore/EfCoreAuditLogRepository.cs @@ -106,6 +106,7 @@ namespace Volo.Abp.AuditLogging.EntityFrameworkCore HttpStatusCode? httpStatusCode = null, bool includeDetails = false) { + var nHttpStatusCode = (int?) httpStatusCode; return DbSet.AsNoTracking() .IncludeDetails(includeDetails) .WhereIf(startTime.HasValue, auditLog => auditLog.ExecutionTime >= startTime) @@ -117,7 +118,7 @@ namespace Volo.Abp.AuditLogging.EntityFrameworkCore .WhereIf(userName != null, auditLog => auditLog.UserName == userName) .WhereIf(applicationName != null, auditLog => auditLog.ApplicationName == applicationName) .WhereIf(correlationId != null, auditLog => auditLog.CorrelationId == correlationId) - .WhereIf(httpStatusCode != null && httpStatusCode > 0, auditLog => auditLog.HttpStatusCode == (int?)httpStatusCode) + .WhereIf(httpStatusCode != null && httpStatusCode > 0, auditLog => auditLog.HttpStatusCode == nHttpStatusCode) .WhereIf(maxExecutionDuration != null && maxExecutionDuration.Value > 0, auditLog => auditLog.ExecutionDuration <= maxExecutionDuration) .WhereIf(minExecutionDuration != null && minExecutionDuration.Value > 0, auditLog => auditLog.ExecutionDuration >= minExecutionDuration); } From 40bc8e3cc1697a3e88b7dd61f849c705755eb76d Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 24 Feb 2020 13:31:44 +0800 Subject: [PATCH 05/22] Audited*WithUser generic type wrong constraint. Resolve #2624 --- .../Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs | 4 ++-- .../Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs | 4 ++-- .../Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs index ec490fbb50..477f8750fd 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedAggregateRootWithUser.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.Domain.Entities.Auditing /// Type of the user [Serializable] public abstract class AuditedAggregateRootWithUser : AuditedAggregateRoot, IAuditedObject - where TUser : IEntity + where TUser : IEntity { /// public virtual TUser Creator { get; set; } @@ -25,7 +25,7 @@ namespace Volo.Abp.Domain.Entities.Auditing /// Type of the user [Serializable] public abstract class AuditedAggregateRootWithUser : AuditedAggregateRoot, IAuditedObject - where TUser : IEntity + where TUser : IEntity { /// public virtual TUser Creator { get; set; } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs index fd6aeb9dd9..cc54209595 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/AuditedEntityWithUser.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.Domain.Entities.Auditing /// Type of the user [Serializable] public abstract class AuditedEntityWithUser : AuditedEntity, IAuditedObject - where TUser : IEntity + where TUser : IEntity { /// public virtual TUser Creator { get; set; } @@ -25,7 +25,7 @@ namespace Volo.Abp.Domain.Entities.Auditing /// Type of the user [Serializable] public abstract class AuditedEntityWithUser : AuditedEntity, IAuditedObject - where TUser : IEntity + where TUser : IEntity { /// public virtual TUser Creator { get; set; } diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs index 12458ebf99..3156813843 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.Domain.Entities.Auditing /// Type of the user [Serializable] public abstract class FullAuditedEntityWithUser : FullAuditedEntity, IFullAuditedObject - where TUser : IEntity + where TUser : IEntity { /// public virtual TUser Deleter { get; set; } @@ -28,7 +28,7 @@ namespace Volo.Abp.Domain.Entities.Auditing /// Type of the user [Serializable] public abstract class FullAuditedEntityWithUser : FullAuditedEntity, IFullAuditedObject - where TUser : IEntity + where TUser : IEntity { /// public virtual TUser Deleter { get; set; } From 22b9756cccd4c9e4b600b039bfca9904b8018347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arma=C4=9Fan=20=C3=9Cnl=C3=BC?= <36102404+armgnunlu@users.noreply.github.com> Date: Mon, 24 Feb 2020 09:48:23 +0300 Subject: [PATCH 06/22] blog edit --- .../src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml index b0f9dc4d46..8c0b63d998 100644 --- a/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml +++ b/modules/blogging/src/Volo.Blogging.Web/Pages/Blogs/Posts/Index.cshtml @@ -142,15 +142,15 @@ var oddPost = index % 2 == 1;
-
-
+
+ -
+

@post.Title

From 8f7baa5bf971330f94c7b99f6ff0422105a9bda7 Mon Sep 17 00:00:00 2001 From: Alper Ebicoglu Date: Mon, 24 Feb 2020 10:40:42 +0300 Subject: [PATCH 07/22] Update UserLookupService.cs --- .../Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs b/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs index d2a13d9ba4..2c28d71b80 100644 --- a/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs +++ b/modules/users/src/Volo.Abp.Users.Domain/Volo/Abp/Users/UserLookupService.cs @@ -32,7 +32,7 @@ namespace Volo.Abp.Users public async Task FindByIdAsync(Guid id, CancellationToken cancellationToken = default) { - var localUser = await _userRepository.FindAsync(id,cancellationToken: cancellationToken); + var localUser = await _userRepository.FindAsync(id, cancellationToken: cancellationToken); if (ExternalUserLookupServiceProvider == null) { @@ -149,4 +149,4 @@ namespace Volo.Abp.Users } } } -} \ No newline at end of file +} From 4391b4a852ef4a7744c9aa7d5f5392f2db31fe53 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 24 Feb 2020 11:07:46 +0300 Subject: [PATCH 08/22] refactor --- .../Services/AbpNuGetIndexUrlService.cs | 48 +++++++++++++++++++ .../Volo/Abp/Cli/Commands/SuiteCommand.cs | 38 +++------------ 2 files changed, 54 insertions(+), 32 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/AbpNuGetIndexUrlService.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/AbpNuGetIndexUrlService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/AbpNuGetIndexUrlService.cs new file mode 100644 index 0000000000..0e1f987d4e --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/Services/AbpNuGetIndexUrlService.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.Cli.Licensing; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.Commands.Services +{ + public class AbpNuGetIndexUrlService : ITransientDependency + { + private readonly IApiKeyService _apiKeyService; + public ILogger Logger { get; set; } + + public AbpNuGetIndexUrlService(IApiKeyService apiKeyService) + { + _apiKeyService = apiKeyService; + Logger = NullLogger.Instance; + } + + public async Task GetAsync() + { + var apiKeyResult = await _apiKeyService.GetApiKeyOrNullAsync(); + + if (apiKeyResult == null) + { + Logger.LogWarning("You are not signed in! Use the CLI command \"abp login \" to sign in, then try again."); + return null; + } + + if (!string.IsNullOrWhiteSpace(apiKeyResult.ErrorMessage)) + { + Logger.LogWarning(apiKeyResult.ErrorMessage); + return null; + } + + if (string.IsNullOrEmpty(apiKeyResult.ApiKey)) + { + Logger.LogError("Couldn't retrieve your NuGet API key! You can re-sign in with the CLI command \"abp login \"."); + return null; + } + + return CliUrls.GetNuGetServiceIndexUrl(apiKeyResult.ApiKey); + } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index a13621ea22..b4a4ff8bdd 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -1,11 +1,10 @@ using System; -using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; -using Volo.Abp.Cli.Licensing; +using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -13,13 +12,13 @@ namespace Volo.Abp.Cli.Commands { public class SuiteCommand : IConsoleCommand, ITransientDependency { + private readonly AbpNuGetIndexUrlService _nuGetIndexUrlService; private const string SuitePackageName = "Volo.Abp.Suite"; public ILogger Logger { get; set; } - private readonly IApiKeyService _apiKeyService; - public SuiteCommand(IApiKeyService apiKeyService) + public SuiteCommand(AbpNuGetIndexUrlService nuGetIndexUrlService) { - _apiKeyService = apiKeyService; + _nuGetIndexUrlService = nuGetIndexUrlService; Logger = NullLogger.Instance; } @@ -53,7 +52,7 @@ namespace Volo.Abp.Cli.Commands private async Task InstallSuiteAsync() { - var nugetIndexUrl = await GetNuGetIndexUrlAsync(); + var nugetIndexUrl = await _nuGetIndexUrlService.GetAsync(); if (nugetIndexUrl == null) { @@ -71,7 +70,7 @@ namespace Volo.Abp.Cli.Commands private async Task UpdateSuiteAsync() { - var nugetIndexUrl = await GetNuGetIndexUrlAsync(); + var nugetIndexUrl = await _nuGetIndexUrlService.GetAsync(); if (nugetIndexUrl == null) { @@ -104,31 +103,6 @@ namespace Volo.Abp.Cli.Commands CmdHelper.RunCmd("abp-suite"); } - private async Task GetNuGetIndexUrlAsync() - { - var apiKeyResult = await _apiKeyService.GetApiKeyOrNullAsync(); - - if (apiKeyResult == null) - { - Logger.LogWarning("You are not signed in! Use the CLI command \"abp login \" to sign in, then try again."); - return null; - } - - if (!string.IsNullOrWhiteSpace(apiKeyResult.ErrorMessage)) - { - Logger.LogWarning(apiKeyResult.ErrorMessage); - return null; - } - - if (string.IsNullOrEmpty(apiKeyResult.ApiKey)) - { - Logger.LogError("Couldn't retrieve your NuGet API key! You can re-sign in with the CLI command \"abp login \"."); - return null; - } - - return CliUrls.GetNuGetServiceIndexUrl(apiKeyResult.ApiKey); - } - public string GetUsageInfo() { var sb = new StringBuilder(); From f11c4223965502a07c720246b404adbd04cac7ef Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 24 Feb 2020 19:32:05 +0800 Subject: [PATCH 09/22] Update cli doc --- docs/en/CLI.md | 7 +++---- docs/zh-Hans/CLI.md | 20 ++++++++++++++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/docs/en/CLI.md b/docs/en/CLI.md index a1d3d51138..6c903575db 100644 --- a/docs/en/CLI.md +++ b/docs/en/CLI.md @@ -51,8 +51,8 @@ abp new Acme.BookStore * `--database-provider` or `-d`: Specifies the database provider. Default provider is `ef`. Available providers: * `ef`: Entity Framework Core. * `mongodb`: MongoDB. - * `module`: [Module template](Startup-Templates/Module.md). Additional options: - * `--no-ui`: Specifies to not include the UI. This makes possible to create service-only modules (a.k.a. microservices - without UI). + * `module`: [Module template](Startup-Templates/Module.md). Additional options: + * `--no-ui`: Specifies to not include the UI. This makes possible to create service-only modules (a.k.a. microservices - without UI). * `--output-folder` or `-o`: Specifies the output folder. Default value is the current directory. * `--version` or `-v`: Specifies the ABP & template version. It can be a [release tag](https://github.com/abpframework/abp/releases) or a [branch name](https://github.com/abpframework/abp/branches). Uses the latest release if not specified. Most of the times, you will want to use the latest version. @@ -161,5 +161,4 @@ Examples: ````bash abp help # Shows a general help. abp help new # Shows help about the "new" command. -```` - +```` \ No newline at end of file diff --git a/docs/zh-Hans/CLI.md b/docs/zh-Hans/CLI.md index f5f230d9f2..863c061209 100644 --- a/docs/zh-Hans/CLI.md +++ b/docs/zh-Hans/CLI.md @@ -125,6 +125,26 @@ abp update [options] #### Options * `--include-previews` 或 `-p`: 将预览版, 测试版本 和 rc 包 同时更新到最新版本. +* `--npm`: 仅更新NPM包 +* `--nuget`: 仅更新的NuGet包 + +### login + +CLI的一些功能需要登录到abp.io平台. 使用你的用户名登录 + +```bash +abp login +``` + +请注意,新的登录将终止先前的会话并创建一个新的会话. + +### logout + +通过从计算机中删除会话令牌来注销. + +``` +abp logout +``` ### help From a7d5cba4ddcab3fa77064756bf92bc21b5b78718 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 24 Feb 2020 21:14:42 +0800 Subject: [PATCH 10/22] Make entity property virtual. https://github.com/abpframework/abp/pull/2900#issuecomment-590256111 --- .../Entities/Auditing/FullAuditedAggregateRootWithUser.cs | 8 ++++---- .../Domain/Entities/Auditing/FullAuditedEntityWithUser.cs | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs index b2dbb8c280..c6bfefbb23 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedAggregateRootWithUser.cs @@ -15,10 +15,10 @@ namespace Volo.Abp.Domain.Entities.Auditing public virtual TUser Deleter { get; set; } /// - public TUser Creator { get; set; } + public virtual TUser Creator { get; set; } /// - public TUser LastModifier { get; set; } + public virtual TUser LastModifier { get; set; } } /// @@ -34,10 +34,10 @@ namespace Volo.Abp.Domain.Entities.Auditing public virtual TUser Deleter { get; set; } /// - public TUser Creator { get; set; } + public virtual TUser Creator { get; set; } /// - public TUser LastModifier { get; set; } + public virtual TUser LastModifier { get; set; } protected FullAuditedAggregateRootWithUser() { diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs index 3156813843..f7ec2b672f 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/Auditing/FullAuditedEntityWithUser.cs @@ -15,10 +15,10 @@ namespace Volo.Abp.Domain.Entities.Auditing public virtual TUser Deleter { get; set; } /// - public TUser Creator { get; set; } + public virtual TUser Creator { get; set; } /// - public TUser LastModifier { get; set; } + public virtual TUser LastModifier { get; set; } } /// @@ -34,10 +34,10 @@ namespace Volo.Abp.Domain.Entities.Auditing public virtual TUser Deleter { get; set; } /// - public TUser Creator { get; set; } + public virtual TUser Creator { get; set; } /// - public TUser LastModifier { get; set; } + public virtual TUser LastModifier { get; set; } protected FullAuditedEntityWithUser() { From 8fb205ea4d5faf7172ce0813a45d0fcf113601f5 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Mon, 24 Feb 2020 16:19:24 +0300 Subject: [PATCH 11/22] Update en.json --- .../AbpIoLocalization/Admin/Localization/Resources/en.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json index 9c00e584ab..5ebdf0b2eb 100644 --- a/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json +++ b/abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json @@ -53,6 +53,7 @@ "CreateANugetPackage": "Create a Nuget package", "AddNew": "Add new", "PackageAlreadyExist{0}": "\"{0}\" package is already added.", + "ModuleAlreadyExist{0}": "\"{0}\" module is already added.", "ClearCache": "Clear cache", "SuccessfullyCleared": "Successfully cleared", "Menu:NpmPackages": "NPM Packages", @@ -83,6 +84,7 @@ "This{0}AlreadyExistInThisOrganization": "This {0} already exist in this organization", "AreYouSureYouWantToDeleteAllComputers": "Are you sure you want to delete all computers?", "DeleteAll": "Delete all", - "DoYouWantToCreateNewUser": "Do you want to create new user?" + "DoYouWantToCreateNewUser": "Do you want to create new user?", + "MasterModules": "Master Modules" } } \ No newline at end of file From d1029ce25558cd495beb33b79f57a741dc3b26d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 24 Feb 2020 17:02:30 +0300 Subject: [PATCH 12/22] Move switch dbms document locations on the navigation tree --- docs/en/Entity-Framework-Core-Other-DBMS.md | 14 ++++++---- docs/en/Entity-Framework-Core.md | 9 ++----- docs/en/docs-nav.json | 30 +++++++++++---------- 3 files changed, 27 insertions(+), 26 deletions(-) diff --git a/docs/en/Entity-Framework-Core-Other-DBMS.md b/docs/en/Entity-Framework-Core-Other-DBMS.md index 854309d070..a08ac6d169 100644 --- a/docs/en/Entity-Framework-Core-Other-DBMS.md +++ b/docs/en/Entity-Framework-Core-Other-DBMS.md @@ -1,12 +1,16 @@ -# Switch to another DBMS for Entity Framework Core +# Switch to Another DBMS for Entity Framework Core -**[The application startup template](Startup-Templates/Application.md)** comes with SQL Server provider pre-configured for the Entity Framework Core. Entity Framework Core supports [many other DBMSs](https://docs.microsoft.com/en-us/ef/core/providers/) and you can use any of them with your ABP based applications. +**[The application startup template](Startup-Templates/Application.md)** comes with **SQL Server provider pre-configured** for the Entity Framework Core. However, EF Core supports [many other DBMSs](https://docs.microsoft.com/en-us/ef/core/providers/) and you can use any of them within your ABP based applications. -ABP framework provides integration packages for some common DBMSs to make the configuration a bit easier (see the [entity framework core document](Entity-Framework-Core.md) for a list of available integration packages). However, you can configure your DBMS provider without these integration packages. +ABP framework provides **integration packages** for some common DBMSs to make the configuration a bit easier. You can use the following documents to learn how to **switch to your favorite DBMS**: -While using the integration package is always recommended (it also makes standard for the depended version across different modules), you can do it manually if there is no integration package for your DBMS provider. +* [MySQL](Entity-Framework-Core-MySQL.md) +* [PostgreSQL](Entity-Framework-Core-PostgreSQL.md) +* [SQLite](Entity-Framework-Core-SQLite.md) -This document explains how to switch to MySQL without using [the MySQL integration package](Entity-Framework-Core-MySQL.md). +However, you can configure your DBMS provider **without** these integration packages. While using the integration package is always recommended (it also makes standard for the depended version across different modules), you can do it manually if there is no integration package for your DBMS provider. + +For an example, this document explains how to switch to MySQL without using [the MySQL integration package](Entity-Framework-Core-MySQL.md). ## Replace the SQL Server Dependency diff --git a/docs/en/Entity-Framework-Core.md b/docs/en/Entity-Framework-Core.md index 586c8d4a01..788f3234ed 100644 --- a/docs/en/Entity-Framework-Core.md +++ b/docs/en/Entity-Framework-Core.md @@ -32,14 +32,9 @@ namespace MyCompany.MyProject Entity Framework Core supports various database management systems ([see all](https://docs.microsoft.com/en-us/ef/core/providers/)). ABP framework and this document doesn't depend on any specific DBMS. -If you are creating a reusable library, avoid to depend on a specific DBMS package. However, in a final application you eventually will select a DBMS. +If you are creating a [reusable application module](Modules/Index.md), avoid to depend on a specific DBMS package. However, in a final application you eventually will select a DBMS. -ABP framework provides integration packages for some common DBMSs to make the configuration a bit easier. [The startup templates](Startup-Templates/Index.md) come with **SQL Server (localdb) pre-configured**. See the following documents to learn how to configure for the other DBMS providers: - -* [MySQL](Entity-Framework-Core-MySQL.md) -* [PostgreSQL](Entity-Framework-Core-PostgreSQL.md) -* [SQLite](Entity-Framework-Core-SQLite.md) -* [Others](Entity-Framework-Core-Other-DBMS.md) +See [Switch to Another DBMS for Entity Framework Core](Entity-Framework-Core-Other-DBMS.md) document to learn how to switch the DBMS. ## Creating DbContext diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index cbb4c80e72..f30b473928 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -295,20 +295,22 @@ "path": "Entity-Framework-Core.md", "items": [ { - "text": "Switch to MySQL", - "path": "Entity-Framework-Core-MySQL.md" - }, - { - "text": "Switch to PostgreSQL", - "path": "Entity-Framework-Core-PostgreSQL.md" - }, - { - "text": "Switch to SQLite", - "path": "Entity-Framework-Core-SQLite.md" - }, - { - "text": "Switch to another DBMS", - "path": "Entity-Framework-Core-Other-DBMS.md" + "text": "Switch DBMS", + "path": "Entity-Framework-Core-Other-DBMS.md", + "items": [ + { + "text": "To MySQL", + "path": "Entity-Framework-Core-MySQL.md" + }, + { + "text": "To PostgreSQL", + "path": "Entity-Framework-Core-PostgreSQL.md" + }, + { + "text": "To SQLite", + "path": "Entity-Framework-Core-SQLite.md" + } + ] } ] }, From f28e11265ba46bef3a115824063bd3fcd042eff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 24 Feb 2020 19:04:15 +0300 Subject: [PATCH 13/22] #2909 Added initial EF Core Migrations document --- docs/en/Entity-Framework-Core-Migrations.md | 123 ++++++++++++++++++ docs/en/Modules/Identity.md | 4 + docs/en/Modules/Tenant-Management.md | 3 + docs/en/_resources/Diagrams.docx | Bin 0 -> 24021 bytes .../images/bookstore-efcore-dependencies.png | Bin 0 -> 38916 bytes docs/en/images/single-database-usage.png | Bin 0 -> 57827 bytes 6 files changed, 130 insertions(+) create mode 100644 docs/en/Entity-Framework-Core-Migrations.md create mode 100644 docs/en/Modules/Identity.md create mode 100644 docs/en/Modules/Tenant-Management.md create mode 100644 docs/en/_resources/Diagrams.docx create mode 100644 docs/en/images/bookstore-efcore-dependencies.png create mode 100644 docs/en/images/single-database-usage.png diff --git a/docs/en/Entity-Framework-Core-Migrations.md b/docs/en/Entity-Framework-Core-Migrations.md new file mode 100644 index 0000000000..7b4e31bc6e --- /dev/null +++ b/docs/en/Entity-Framework-Core-Migrations.md @@ -0,0 +1,123 @@ +# EF Core Code First Migrations + +Entity Framework Core provides an easy to use and powerful [database migration system](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/). ABP Framework [startup templates](Startup-Templates/Index.md) takes the advantage of this system to allows you to develop your application in a standard way. + +> See [its own documentation](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) to understand the EF Core Code First Migrations and why you need to such a system. + +However, EF Core migration system is **not so good in a modular environment** where each module maintains its **own database schema** while two or more modules may **share a single database** in practical. + +Since ABP Framework cares about modularity in all aspects, it provides a **solution** to this problem. It is important to understand this solution if you need to **customize your database structure**. + +This document begins by **introducing the default structure** provided by [the application startup template](Startup-Templates/Application.md) and **discusses various scenarios** you may want to implement for your application. + +## The Default Solution & Database Configuration + +When you [create a new web application](https://abp.io/get-started) (with EF Core, which is the default database provider), your solution structure will be similar to the picture below: + +![bookstore-visual-studio-solution-v3](D:\Github\abp\docs\en\images\bookstore-visual-studio-solution-v3.png) + +> Actual solution structure may be a bit different based on your preferences, but the database part will be same. + +### The Database Structure + +The startup template has some [application modules](Modules/Index.md) pre-installed. Each layer of the solution has corresponding module package references. So, the `.EntityFrameworkCore` project has the NuGet references for the `.EntityFrameworkCore` packages of the used modules: + +![bookstore-efcore-dependencies](D:\Github\abp\docs\en\images\bookstore-efcore-dependencies.png) + +In this way, you collect all the EF Core dependencies under the `.EntityFrameworkCore` project. + +> In addition to the module references, it references to the `Volo.Abp.EntityFrameworkCore.SqlServer` package since the startup template is pre-configured for the SQL Server. See the documentation if you want to [switch to another DBMS](Entity-Framework-Core-Other-DBMS.md). + +While every module has its own `DbContext` class by design and can use its **own physical database**, the solution is configured to use a **single shared database** as shown in the figure below: + +![single-database-usage](D:\Github\abp\docs\en\images\single-database-usage.png) + +This is **the simplest configuration** and suitable for most of the applications. `appsettings.json` file has a **single connection string**, named `Default`: + +````json +"ConnectionStrings": { + "Default": "..." +} +```` + +So, you have a **single database schema** which contains all the tables of the modules **sharing** this database. + +#### Module Tables + +Every module uses its own databases tables. For example, the [Identity Module](Modules/Identity.md) has some tables to manage the users and roles in the system. + +#### Table Prefixes + +Since it is allowed to share a single database by all modules (it is the default configuration), a module typically uses a prefix to group its own tables. + +The fundamental modules, like [Identity](Modules/Identity.md), [Tenant Management](Modules/Tenant-Management.md) and [Audit Logs](Modules/Audit-Logging.md), use the `Abp` prefix, while some other modules use their own prefixes. [Identity Server](Modules/IdentityServer.md) module uses the `IdentityServer` prefix for example. + +If you want, you can change the database table name prefix for a module for your application. Example: + +````csharp +Volo.Abp.IdentityServer.AbpIdentityServerDbProperties.DbTablePrefix = "Ids"; +```` + +This code changes the prefix of the [Identity Server](Modules/IdentityServer.md) module. Write this code at the very beginning in your application. + +> Every module also defines `DbSchema` property (near to `DbTablePrefix`), so you can set it for the databases support the schema usage. + +### The Projects + +From the database point of view, there are three important projects those will be explained in the next sections. + +#### .EntityFrameworkCore Project + +This project has the `DbContext` class (`BookStoreDbContext` for this sample) of your application. You typically use this `DbContext` in your application code (in your custom [repositories](Repositories.md) if you follow the best practices). + +It is almost an empty `DbContext` since your application don't have any entities at the beginning, except the pre-defined `AppUser` entity: + +````csharp +[ConnectionStringName("Default")] +public class BookStoreDbContext : AbpDbContext +{ + public DbSet Users { get; set; } + + /* Add DbSet properties for your Aggregate Roots / Entities here. */ + + public BookStoreDbContext(DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + /* Configure the shared tables (with included modules) here */ + + builder.Entity(b => + { + //Sharing the same table "AbpUsers" with the IdentityUser + b.ToTable("AbpUsers"); + + //Configure base properties + b.ConfigureByConvention(); + b.ConfigureAbpUser(); + + //Moved customization of the "AbpUsers" table to an extension method + b.ConfigureCustomUserProperties(); + }); + + /* Configure your own tables/entities inside the ConfigureBookStore method */ + builder.ConfigureBookStore(); + } +} +```` + +This simple `DbContext` class still needs some explanations: + +* It defines a `[ConnectionStringName]` attribute which tells ABP to use the `Default` connection string for this `Dbcontext` (You can see the [connection string document](Connection-Strings.md) to learn how ABP manages the connection strings. For now, you can ignore it since this document will return to this topic later). +* It inherits from the `AbpDbContext` instead of the standard `DbContext` class (You can see the [EF Core integration](Entity-Framework-Core.md) document for more. For now, know that the `AbpDbContext` base class implements some conventions of the ABP Framework to automate some common tasks for you). +* It declares a `DbSet` property for the `AppUser` entity. `AppUser` shares the same table (named `AbpUsers` by default) with the `IdentityUser` entity of the [Identity module](Modules/Identity.md). The startup template provides this entity inside the application since we think that the User entity is generally needs to be customized in your application. +* The constructor takes a `DbContextOptions` instance. +* It overrides the `OnModelCreating` method to define the EF Core mappings. + * It first calls the the `base.OnModelCreating` method to let the ABP Framework to implement the base mappings for us. + * It then configures the mapping for the `AppUser` entity. There is a special case for this entity, which will be explained in the next sections. + * It finally calls the `builder.ConfigureBookStore()` extension method to configure other entities of your application. \ No newline at end of file diff --git a/docs/en/Modules/Identity.md b/docs/en/Modules/Identity.md new file mode 100644 index 0000000000..028144c624 --- /dev/null +++ b/docs/en/Modules/Identity.md @@ -0,0 +1,4 @@ +# Identity Management Module + +See [the source code](https://github.com/abpframework/abp/tree/dev/modules/identity). Documentation will come soon... + diff --git a/docs/en/Modules/Tenant-Management.md b/docs/en/Modules/Tenant-Management.md new file mode 100644 index 0000000000..73e16aee8e --- /dev/null +++ b/docs/en/Modules/Tenant-Management.md @@ -0,0 +1,3 @@ +# Tenant Management Module + +TODO \ No newline at end of file diff --git a/docs/en/_resources/Diagrams.docx b/docs/en/_resources/Diagrams.docx new file mode 100644 index 0000000000000000000000000000000000000000..ed03173ec3681ee8f859be2655af0a7873e7fb54 GIT binary patch literal 24021 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 literal 0 HcmV?d00001 diff --git a/docs/en/images/bookstore-efcore-dependencies.png b/docs/en/images/bookstore-efcore-dependencies.png new file mode 100644 index 0000000000000000000000000000000000000000..3de5a679ef864b036bf21173397e23c38c0b4a1c GIT binary patch literal 38916 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 Yx3;{A*7xVCHw4@yMdd^)h4cgd4>CTnvH$=8 literal 0 HcmV?d00001 diff --git a/docs/en/images/single-database-usage.png b/docs/en/images/single-database-usage.png new file mode 100644 index 0000000000000000000000000000000000000000..525cd7ad0ac9839433fec898fc328cfd07c31ee7 GIT binary patch literal 57827 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 z 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 JKB`%V{SUjK1nB?( literal 0 HcmV?d00001 From 388cbc54d6aed69fe7c49ceb89275eac6b41f384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 24 Feb 2020 19:05:16 +0300 Subject: [PATCH 14/22] Fix image paths --- docs/en/Entity-Framework-Core-Migrations.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/Entity-Framework-Core-Migrations.md b/docs/en/Entity-Framework-Core-Migrations.md index 7b4e31bc6e..a2debb6435 100644 --- a/docs/en/Entity-Framework-Core-Migrations.md +++ b/docs/en/Entity-Framework-Core-Migrations.md @@ -14,7 +14,7 @@ This document begins by **introducing the default structure** provided by [the a When you [create a new web application](https://abp.io/get-started) (with EF Core, which is the default database provider), your solution structure will be similar to the picture below: -![bookstore-visual-studio-solution-v3](D:\Github\abp\docs\en\images\bookstore-visual-studio-solution-v3.png) +![bookstore-visual-studio-solution-v3](images/bookstore-visual-studio-solution-v3.png) > Actual solution structure may be a bit different based on your preferences, but the database part will be same. @@ -22,7 +22,7 @@ When you [create a new web application](https://abp.io/get-started) (with EF Cor The startup template has some [application modules](Modules/Index.md) pre-installed. Each layer of the solution has corresponding module package references. So, the `.EntityFrameworkCore` project has the NuGet references for the `.EntityFrameworkCore` packages of the used modules: -![bookstore-efcore-dependencies](D:\Github\abp\docs\en\images\bookstore-efcore-dependencies.png) +![bookstore-efcore-dependencies](images/bookstore-efcore-dependencies.png) In this way, you collect all the EF Core dependencies under the `.EntityFrameworkCore` project. @@ -30,7 +30,7 @@ In this way, you collect all the EF Core dependencies under the `.EntityFramewor While every module has its own `DbContext` class by design and can use its **own physical database**, the solution is configured to use a **single shared database** as shown in the figure below: -![single-database-usage](D:\Github\abp\docs\en\images\single-database-usage.png) +![single-database-usage](images/single-database-usage.png) This is **the simplest configuration** and suitable for most of the applications. `appsettings.json` file has a **single connection string**, named `Default`: From bb8c6dc0acd73fbb7cedda57a9d1da798dddec79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 24 Feb 2020 19:32:49 +0300 Subject: [PATCH 15/22] Improve the Entity-Framework-Core-Migrations.md --- docs/en/Entity-Framework-Core-Migrations.md | 31 ++++++++++++++++---- docs/en/_resources/Diagrams.docx | Bin 24021 -> 24068 bytes docs/en/images/single-database-usage.png | Bin 57827 -> 54989 bytes 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/docs/en/Entity-Framework-Core-Migrations.md b/docs/en/Entity-Framework-Core-Migrations.md index a2debb6435..1440933529 100644 --- a/docs/en/Entity-Framework-Core-Migrations.md +++ b/docs/en/Entity-Framework-Core-Migrations.md @@ -1,6 +1,6 @@ # EF Core Code First Migrations -Entity Framework Core provides an easy to use and powerful [database migration system](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/). ABP Framework [startup templates](Startup-Templates/Index.md) takes the advantage of this system to allows you to develop your application in a standard way. +Entity Framework Core provides an easy to use and powerful [database migration system](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/). ABP Framework [startup templates](Startup-Templates/Index.md) take the advantage of this system to allow you to develop your application in a standard way. > See [its own documentation](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) to understand the EF Core Code First Migrations and why you need to such a system. @@ -8,7 +8,7 @@ However, EF Core migration system is **not so good in a modular environment** wh Since ABP Framework cares about modularity in all aspects, it provides a **solution** to this problem. It is important to understand this solution if you need to **customize your database structure**. -This document begins by **introducing the default structure** provided by [the application startup template](Startup-Templates/Application.md) and **discusses various scenarios** you may want to implement for your application. +This document begins by **introducing the default structure** provided by [the application startup template](Startup-Templates/Application.md) and **discusses various scenarios** you may want to implement for your own application. ## The Default Solution & Database Configuration @@ -42,9 +42,22 @@ This is **the simplest configuration** and suitable for most of the applications So, you have a **single database schema** which contains all the tables of the modules **sharing** this database. +ABP Framework's [connection string](Connection-Strings.md) system allows you to easily **set a different connection string** for a desired module: + +````json +"ConnectionStrings": { + "Default": "...", + "AbpAuditLogging": "..." +} +```` + +The example configuration about tells to the ABP Framework to use the second connection string for the [Audit Logging module](Modules/Audit-Logging.md). + +However, this is just the beginning. You also need to create the second database, create audit log tables inside it and maintain the database tables using the code first approach. One of the main purposes of this document is to guide you on such database separation scenarios. + #### Module Tables -Every module uses its own databases tables. For example, the [Identity Module](Modules/Identity.md) has some tables to manage the users and roles in the system. +Every module uses its own databases tables. For example, the [Identity Module](Modules/Identity.md) has some tables to manage the users and roles in the system. #### Table Prefixes @@ -113,11 +126,17 @@ public class BookStoreDbContext : AbpDbContext This simple `DbContext` class still needs some explanations: -* It defines a `[ConnectionStringName]` attribute which tells ABP to use the `Default` connection string for this `Dbcontext` (You can see the [connection string document](Connection-Strings.md) to learn how ABP manages the connection strings. For now, you can ignore it since this document will return to this topic later). -* It inherits from the `AbpDbContext` instead of the standard `DbContext` class (You can see the [EF Core integration](Entity-Framework-Core.md) document for more. For now, know that the `AbpDbContext` base class implements some conventions of the ABP Framework to automate some common tasks for you). +* It defines a `[ConnectionStringName]` attribute which tells ABP to always use the `Default` connection string for this `Dbcontext`. +* It inherits from the `AbpDbContext` instead of the standard `DbContext` class. You can see the [EF Core integration](Entity-Framework-Core.md) document for more. For now, know that the `AbpDbContext` base class implements some conventions of the ABP Framework to automate some common tasks for you. * It declares a `DbSet` property for the `AppUser` entity. `AppUser` shares the same table (named `AbpUsers` by default) with the `IdentityUser` entity of the [Identity module](Modules/Identity.md). The startup template provides this entity inside the application since we think that the User entity is generally needs to be customized in your application. * The constructor takes a `DbContextOptions` instance. * It overrides the `OnModelCreating` method to define the EF Core mappings. * It first calls the the `base.OnModelCreating` method to let the ABP Framework to implement the base mappings for us. * It then configures the mapping for the `AppUser` entity. There is a special case for this entity, which will be explained in the next sections. - * It finally calls the `builder.ConfigureBookStore()` extension method to configure other entities of your application. \ No newline at end of file + * It finally calls the `builder.ConfigureBookStore()` extension method to configure other entities of your application. + +This design will be explained in more details after introducing the other database related projects. + +#### .EntityFrameworkCore.DbMigrations Project + +TODO \ No newline at end of file diff --git a/docs/en/_resources/Diagrams.docx b/docs/en/_resources/Diagrams.docx index ed03173ec3681ee8f859be2655af0a7873e7fb54..792d473e3f429de73d727405562bba354d7a3e69 100644 GIT binary patch delta 14984 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 delta 14935 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

O?4$j$mW==H{u`@rh}zoBhWyZysPsOr!fQ@IP| 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 literal 57827 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 z zQNT@3)T?##>sx;2y5HNIxzozLzyRJqI!%MmQw@8x*Wkp>Cf~1Cy(?1vz6&QQY00LM z92ko6BLp=vwlX?v>dlu-4T@M5ct~`lWm;9g(Lb(4YIACZLX`RL@_uu12(+lcK~d_q z$K;GMLMSeK+O|rIOE^%Ot=pl$-7OQEhdhtxJxxy!hIN5rpM9=4H=_{6)+vCmF zSCGoAS=a)XieO5kV{(0CqNn&R-443yrm!7YP*I~$ z5Z|A*w{9iYgC|y3g+P^S>1jKVQ+@^2VmKh`@}@;OmzjSG_O>{7BPF-{%!WpUPYB|PiY*!h(*&3?TXpP?W z{Npct5S&%xjE<(xrtJu~OuHzNUyk{o&aV5P&Gr44a~w(?qiB_K6fHtgqrs2UAgTa6l}Aw{jAF>6$*+BM@t?N}xD_}$;!& zzH(jfYjp>`5>l)HVc&cTK6;}d+hAA1yoL&C@xrgse6uDIP|;hTKMBlwOwj3cJ*eMb zPyX`7zj-Wose_osSC^TRO1H+>pvq9k-h0;j!QxD?+gqyhI?}ZMBXC4j)z%79WXU9D zC@-6TZZBI*@cNw{4plz1nNF{U7#jmP(JkjbU_)0|%$g?6$XLmDebO~}n@7h9gbM;3 z8m~>11w|BdNv!48ANpn20B!|>O=kRq0p<&Q?sJs1?A{y7!%koD?%jY6A?=4O|B* zo4_^qL2p7s!x4zfc34AxOOc@7pghb5GbRH{_=9%X3cWU_3DhxZ!I-hhW(~Ih5V1BM zNr5@Vd13UWPnFS2E4-3)Dd+SP&u{g#V0y-f0nXFq&P#=Qf9SE5t09Ws$7*D>PYAU= zp08$)Ztnj|exM4e0fH+r12Z~MOtMDU5j^{6PRCJhY}7xNB%k3&PImPF|kp}E(Q;Vg;UA%*`ErFY?q2-x^(j`0O98F z0Dzs%0B;o@_oyX|&MwbKQxrrM5O>!m5-A#jv|4jmWNWEqmZJYasijQ@z{kZAZ~hpW zZ|qOha6zQd>b5bNXD;`s*pGa~Tvh1!--Y_A|2Nz5_a(Aa)aMio>{|qg)RN{TL3#62o0s%{)=+F;8?Iw!BqT8_cAS4&mWqGH!bi0 z_~-xcHTK|P>yPQxCDCSU)CC#{XXNS;H8uv(P9PdLXj?g)diiw(Q9cc}5cF3+#VMxC zBLbQLk^MZ$$j_U zik)uE^*_VH55=^XO9GL%NBm#s9h!FL5w=>NWC3gDqL`4=^-!~x0Gpul{IN44=E5(#EY`<-32L))T&fug|5 zjF$Qlx`q)tUK5v94+HfsprZl3WVWs^Qo`8L@$goZ{EOQof#3HWdvC0U*D$j!ItsGe z6v$eiEQWvU+i~Q4g*IQWFvr882g~Wwl^WU%PK*k>Wz0rL&PnVT_V7dvM9`|5vrxXC zzw8yY-Hn>j&nL@%LCuX$>AJ&ad#dX@Yd!T(Oc#+&Q{7YCsl-z+MN#C!yV!l46@tH% zW&DoLMSrrL!Qt1KiJs4%o{6&E!L`8)h^~8exKKnHG7V~k3O8;+OM$f1WsL$ib0isj=dHZ zn)v$et&N5i)bkNY+w22!1r+ekxD<|%c(%#YPFAX&+LtIOFv1vSSDVvD1zLqCfNR*yo*tgPLctve;c)ED;`NjqRA0``2`QT~18S^xkP(>gw&=epRX@SO@wB#@ znwF#49wt|RBC#2ElZdN`PQvt^Y|!uzV}JjsO&7~Dep*n{ zC`!UhKfz0bHjK_?8?T1;aWV&jA<%nSp!~%q$nZlUkrd38;a ztX75(#pN9P*hz`PbfRG0{9Z%OsGZZ-Cn|Kk2armN$fSqZj2iWqc{JptG5>EQ7(|nEi zc3NSswuCcS{B|Z3Hmf>#LRF2+&t)S+Rk3XPa&nD)zzu@g%vS>_Ciqrb?dDEH12O}0 zm91%QB(3Vh^jx`zt9K`K8VbW4^0s1<8(~V^W^YVC>b z-p{WS-0}K;-Ue$}F-IIRC8g@4Hw~okghcvzpl~<5f|C=YG6`!4LC>_RnmmqM%zUn> zO$4LVNUm17H)Ng=oip8;>Y4|?%l(@$@p~>`U8#arfHe5*)S#)p)HC_a(XrE^UQX?S zqB8KARe-drM*M(NRDnU`Vu$#~f`mBCcu2oAYhX$iMS>UvAAdr##?{1i`mbnVe> z)$hT#B)4O&72qdl1@@O@Nr&oVWq%0l(W|h$oiB_ECVpsI^4)!KK>oGcGBW5mHnRG> zxojP5T3J@nDxHvEYJ5*?Am#vBlbf^rjnB`e!>Oa&GjnA!#=+>QbXXZ8@TC=Ie4{WV zce&DYTp^0ceT7%Hj9Y^U{*$RovBg`>Sk>VgPLzj=n;%AL+%Vd0~< zOmRh*Ah8}&S{FJjZBHs#N6f1PC>=b1BPom=-H3rT!X%`uiPBO`@)fhGtFF9VqO&3{|cjNI3Bslk2t*azOQ`;2JBwzRaP#ix$lrX`*3-8GZ zz_6#j%K4u3;YpK()leVtYoSo@O*iFEj!M0vq-1Y1xj(ai^K#;~<>5SWmak$yA-!-+ z;ON{4KM?I>3H~>s6G(E&oBWN6!M}87kw$NSrZyYqsJlVsLcB8=V}Kos4H`+dq3>hE z3?R$A)w2S@G38C>=zZy!%otxNN}3U=VB9&lo-=qj!}7$488c8Hnw38!_Crn%nrR>N z$2)Fk5#ycl$R|zSv+=W49#*_le8PoeEPVIimZ0=B5ftpVj!q*pny4A6;IofUvWCmN zwV-6X7%ZEYc}>~oX?(tVyb@uUN3u%8f?httB`yYqv_LawJN=cLRNxRho?^fLmUo2N z<5){f6iO(Ykp6J{CK|hUK{z(&!h*x$T7Yfj$Lf~RdxBV(M>?@s>DQu-{>md4A+pAI zgZJm{M_;t_H>u1GOr5yC3vyFB$lA>q-P8QOV=tG5M(uzDsiGt!R`R0sHH&Lu(*$Ds zWU3kfNZvGox?c*Pu|UhGA9fw&1#i|ROnf)3m*82Mgh4GukR6F7(Hk3}kCy9{tE;2O zr-iDmHT}k%9G)X*jes!wz)2UXf3y#Oi@p>XpkD@3z;;+}e3KtRvbuC<--1q1Lwsd) zLucW{Q#QO%2q(++ASN+IR_4LgrbLg4{a57m>gtbhle<2G!|d+qlAIiZupc`|S$c5^ zpG!G6;xFh&kN2ZKg!8Ch?LFnmzXo~86_;35z&R9n)%p|Cg11YOD<*i>ld}x49 zzpiPkpqML({;F+^LxHeMO`m0_c_5E;uF*_D(8*EqCdb717sgqI!V-Hw z&|$J!g+ltGPI9^ru?33HT3>T0L5K>pm*}^XFg`dYFWIB>wzhZ4YX+TtQ~Zz z8X$^Ojl<`PZ4xG=mvKy69+nS)*ZW*78|?_JPBtli{>7v`Vn!4QnK(bhLD#|6eObU6S)TJifl;@oeINlf3lPH-y2M z;taqTd(k0=8Spn_6zAMO0~OHw?sZ?z1m!j;w?#pi&;NbuqcfDunTIm>^k>SCA8JB1 JKB`%V{SUjK1nB?( From 50171b9fb0f865502db5375c8b018e1bd7c3e17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 24 Feb 2020 21:59:04 +0300 Subject: [PATCH 16/22] Created Tutorials index page --- docs/en/Tutorials/Index.md | 6 ++++++ docs/en/docs-nav.json | 1 + 2 files changed, 7 insertions(+) create mode 100644 docs/en/Tutorials/Index.md diff --git a/docs/en/Tutorials/Index.md b/docs/en/Tutorials/Index.md new file mode 100644 index 0000000000..7391b6303e --- /dev/null +++ b/docs/en/Tutorials/Index.md @@ -0,0 +1,6 @@ +# Tutorials + +## Application Development + +* [With ASP.NET Core MVC / Razor Pages UI](AspNetCore-Mvc/Part-I.md) +* [With Angular UI](Angular/Part-I.md) diff --git a/docs/en/docs-nav.json b/docs/en/docs-nav.json index f30b473928..0de3be1651 100644 --- a/docs/en/docs-nav.json +++ b/docs/en/docs-nav.json @@ -33,6 +33,7 @@ }, { "text": "Tutorials", + "path": "Tutorials/Index.md", "items": [ { "text": "Application Development", From 13b47c127e776791f133870e706d40a75816fdc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Mon, 24 Feb 2020 21:59:12 +0300 Subject: [PATCH 17/22] Update Entity-Framework-Core-Migrations.md --- docs/en/Entity-Framework-Core-Migrations.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/en/Entity-Framework-Core-Migrations.md b/docs/en/Entity-Framework-Core-Migrations.md index 1440933529..eb3125c13b 100644 --- a/docs/en/Entity-Framework-Core-Migrations.md +++ b/docs/en/Entity-Framework-Core-Migrations.md @@ -1,14 +1,18 @@ -# EF Core Code First Migrations +# EF Core Advanced Database Migrations -Entity Framework Core provides an easy to use and powerful [database migration system](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/). ABP Framework [startup templates](Startup-Templates/Index.md) take the advantage of this system to allow you to develop your application in a standard way. +This document begins by **introducing the default structure** provided by [the application startup template](Startup-Templates/Application.md) and **discusses various scenarios** you may want to implement for your own application. + +> This document is for who want to fully understand and customize the database structure comes with [the application startup template](Startup-Templates/Application.md). If you simply want to create entities and manage your code first migrations, just follow [the startup tutorials](Tutorials/Index.md). -> See [its own documentation](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) to understand the EF Core Code First Migrations and why you need to such a system. +## About the EF Core Code First Migrations + +Entity Framework Core provides an easy to use and powerful [database migration system](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/). ABP Framework [startup templates](Startup-Templates/Index.md) take the advantage of this system to allow you to develop your application in a standard way. However, EF Core migration system is **not so good in a modular environment** where each module maintains its **own database schema** while two or more modules may **share a single database** in practical. Since ABP Framework cares about modularity in all aspects, it provides a **solution** to this problem. It is important to understand this solution if you need to **customize your database structure**. -This document begins by **introducing the default structure** provided by [the application startup template](Startup-Templates/Application.md) and **discusses various scenarios** you may want to implement for your own application. +> See [EF Core's own documentation](https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/) to fully learn the EF Core Code First Migrations and why you need to such a system. ## The Default Solution & Database Configuration From a84792fb28697651135296655bafb6f9a42c02ce Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 25 Feb 2020 08:50:53 +0800 Subject: [PATCH 18/22] Update Exception-Handling.md --- docs/zh-Hans/Exception-Handling.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/zh-Hans/Exception-Handling.md b/docs/zh-Hans/Exception-Handling.md index a251c50f61..36f959f312 100644 --- a/docs/zh-Hans/Exception-Handling.md +++ b/docs/zh-Hans/Exception-Handling.md @@ -204,7 +204,7 @@ throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage" 首先,在模块配置代码中将 **code-namespace** 映射至 **本地化资源**: ````C# -services.Configure(options => +services.Configure(options => { options.MapCodeNamespace("Volo.Qa", typeof(QaResource)); }); @@ -285,7 +285,7 @@ ABP尝试按照以下规则,自动映射常见的异常类型的HTTP状态代码 可以重写HTTP状态代码的自动映射,示例如下: ````C# -services.Configure(options => +services.Configure(options => { options.Map("Volo.Qa:010002", HttpStatusCode.Conflict); }); From 75972bde74c180030c45cf6bbf34cfbe811be971 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 25 Feb 2020 08:51:41 +0800 Subject: [PATCH 19/22] Update Exception-Handling.md --- docs/en/Exception-Handling.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/Exception-Handling.md b/docs/en/Exception-Handling.md index 93bad2b6ed..0e0a530416 100644 --- a/docs/en/Exception-Handling.md +++ b/docs/en/Exception-Handling.md @@ -204,7 +204,7 @@ Instead of localizing the message while throwing the exception, you can separate First, define the **code-namespace** to **localization resource** mapping in the module configuration: ````C# -services.Configure(options => +services.Configure(options => { options.MapCodeNamespace("Volo.Qa", typeof(QaResource)); }); @@ -285,7 +285,7 @@ The `IHttpExceptionStatusCodeFinder` is used to automatically determine the HTTP Automatic HTTP status code determination can be overrided by custom mappings. For example: ````C# -services.Configure(options => +services.Configure(options => { options.Map("Volo.Qa:010002", HttpStatusCode.Conflict); }); From 56b6ed4f015d0985248bc70bd34030ee7a6219f1 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 25 Feb 2020 10:58:21 +0800 Subject: [PATCH 20/22] Update document --- .../Entity-Framework-Core-Other-DBMS.md | 8 +++-- docs/zh-Hans/Entity-Framework-Core.md | 9 ++--- docs/zh-Hans/Exception-Handling.md | 6 ++-- docs/zh-Hans/Tutorials/Angular/Part-I.md | 3 ++ .../{ => AspNetCore-Mvc}/Part-I.md | 26 +++++++-------- .../{ => AspNetCore-Mvc}/Part-II.md | 0 .../{ => AspNetCore-Mvc}/Part-III.md | 2 +- .../images/bookstore-add-create-dialog-v2.png | Bin .../images/bookstore-add-edit-dialog.png | Bin .../images/bookstore-add-index-page-v2.png | Bin .../images/bookstore-appservice-tests.png | Bin .../images/bookstore-book-list-2.png | Bin .../images/bookstore-book-list.png | Bin .../images/bookstore-books-table-actions.png | Bin .../images/bookstore-books-table.png | Bin .../images/bookstore-create-dialog-2.png | Bin .../images/bookstore-create-dialog.png | Bin .../images/bookstore-create-template.png | Bin .../images/bookstore-homepage.png | Bin .../images/bookstore-index-js-file-v2.png | Bin .../bookstore-localization-files-v2.png | Bin .../images/bookstore-menu-items.png | Bin .../images/bookstore-new-book-button.png | Bin .../bookstore-pmc-add-book-migration-v2.png | Bin .../bookstore-pmc-add-book-migration.png | Bin .../images/bookstore-swagger.png | Bin ...ookstore-test-js-proxy-getlist-network.png | Bin .../bookstore-test-js-proxy-getlist.png | Bin .../images/bookstore-test-projects-v2.png | Bin .../images/bookstore-user-management.png | Bin .../bookstore-visual-studio-solution-v3.png | Bin .../zh-Hans/Tutorials/AspNetCore-Mvc/Index.md | 6 ++++ docs/zh-Hans/docs-nav.json | 31 ++++++++++-------- 33 files changed, 51 insertions(+), 40 deletions(-) create mode 100644 docs/zh-Hans/Tutorials/Angular/Part-I.md rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/Part-I.md (92%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/Part-II.md (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/Part-III.md (99%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-add-create-dialog-v2.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-add-edit-dialog.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-add-index-page-v2.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-appservice-tests.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-book-list-2.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-book-list.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-books-table-actions.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-books-table.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-create-dialog-2.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-create-dialog.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-create-template.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-homepage.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-index-js-file-v2.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-localization-files-v2.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-menu-items.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-new-book-button.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-pmc-add-book-migration-v2.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-pmc-add-book-migration.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-swagger.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-test-js-proxy-getlist-network.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-test-js-proxy-getlist.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-test-projects-v2.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-user-management.png (100%) rename docs/zh-Hans/Tutorials/AspNetCore-Mvc/{ => AspNetCore-Mvc}/images/bookstore-visual-studio-solution-v3.png (100%) create mode 100644 docs/zh-Hans/Tutorials/AspNetCore-Mvc/Index.md diff --git a/docs/zh-Hans/Entity-Framework-Core-Other-DBMS.md b/docs/zh-Hans/Entity-Framework-Core-Other-DBMS.md index 943667eb55..a1af1c5849 100644 --- a/docs/zh-Hans/Entity-Framework-Core-Other-DBMS.md +++ b/docs/zh-Hans/Entity-Framework-Core-Other-DBMS.md @@ -2,9 +2,13 @@ **[应用程序启动模板](Startup-Templates/Application.md)** 为EF Core预配置了Sql Server提供程序,EF Core支持许多其它DBMS,你可以在基于ABP的应用程序使用它们. -ABP框架为一些常见的DMBS提供了简化配置的集成包(有关可用集成包的列表,请参阅[EF Core文档](Entity-Framework-Core.md)),你也可以不使用集成包配置DBMS提供程序. +ABP框架为一些常见的DMBS提供了简化配置的**集成包**,你可以通过以下文档来学习如何**切换到你喜欢的DBMS**: -虽然总是建议使用集成包(它也使不同模块之间的依赖版本成为标准版本),但是如果没有用于DBMS提供程序的集成包,也可以手动集成. +* [MySQL](Entity-Framework-Core-MySQL.md) +* [PostgreSQL](Entity-Framework-Core-PostgreSQL.md) +* [SQLite](Entity-Framework-Core-SQLite.md) + +你也可以不使用集成包配置DBMS提供程序,虽然总是建议使用集成包(它也使不同模块之间的依赖版本成为标准版本),但是如果没有用于DBMS提供程序的集成包,也可以手动集成. 本文介绍了如何在不使用[MySQL集成包](Entity-Framework-Core-MySQL.md)的情况下切换到MySQL. diff --git a/docs/zh-Hans/Entity-Framework-Core.md b/docs/zh-Hans/Entity-Framework-Core.md index b70630e38f..0bec4d1ab9 100644 --- a/docs/zh-Hans/Entity-Framework-Core.md +++ b/docs/zh-Hans/Entity-Framework-Core.md @@ -32,14 +32,9 @@ namespace MyCompany.MyProject EF Core支持多种数据库管理系统([查看全部](https://docs.microsoft.com/en-us/ef/core/providers/)). ABP框架和本文档不依赖于任何特定的DBMS. -如果要创建一个可重用的库,应避免依赖于特定的DBMS包.但在最终的应用程序中,始终会选择一个DBMS. +如果要创建一个可重用的[应用程序模块](Modules/Index.md),应避免依赖于特定的DBMS包.但在最终的应用程序中,始终会选择一个DBMS. -ABP框架为一些常见的DBMS提供了集成包,使配置变得更加简单. [启动模板](Startup-Templates/Index.md)附带**预先配置的SQL Server (localdb)**.请参阅以下文档,了解如何配置其他DBMS提供程序: - -* [MySQL](Entity-Framework-Core-MySQL.md) -* [PostgreSQL](Entity-Framework-Core-PostgreSQL.md) -* [SQLite](Entity-Framework-Core-SQLite.md) -* [Others](Entity-Framework-Core-Other-DBMS.md) +参阅[为Entity Framework Core切换到其他DBMS](Entity-Framework-Core-Other-DBMS.md)文档学习如何切换DBMS. ## 创建 DbContext diff --git a/docs/zh-Hans/Exception-Handling.md b/docs/zh-Hans/Exception-Handling.md index 36f959f312..c1132d4e3c 100644 --- a/docs/zh-Hans/Exception-Handling.md +++ b/docs/zh-Hans/Exception-Handling.md @@ -190,7 +190,7 @@ throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage" "UserNameShouldBeUniqueMessage": "Username should be unique! '{0}' is already taken!" ```` -* `IUserFriendlyException`接口派生自`IBusinessException`,而 `UserFriendlyException `类派生自`BusinessException`类. +* `IUserFriendlyException`接口派生自`IBusinessException`,而 `UserFriendlyException`类派生自`BusinessException`类. #### 使用错误代码 @@ -204,7 +204,7 @@ throw new UserFriendlyException(_stringLocalizer["UserNameShouldBeUniqueMessage" 首先,在模块配置代码中将 **code-namespace** 映射至 **本地化资源**: ````C# -services.Configure(options => +services.Configure(options => { options.MapCodeNamespace("Volo.Qa", typeof(QaResource)); }); @@ -285,7 +285,7 @@ ABP尝试按照以下规则,自动映射常见的异常类型的HTTP状态代码 可以重写HTTP状态代码的自动映射,示例如下: ````C# -services.Configure(options => +services.Configure(options => { options.Map("Volo.Qa:010002", HttpStatusCode.Conflict); }); diff --git a/docs/zh-Hans/Tutorials/Angular/Part-I.md b/docs/zh-Hans/Tutorials/Angular/Part-I.md new file mode 100644 index 0000000000..8e8c74ec59 --- /dev/null +++ b/docs/zh-Hans/Tutorials/Angular/Part-I.md @@ -0,0 +1,3 @@ +## Angular 教程 - 第一章 + +TODO... \ No newline at end of file diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/Part-I.md similarity index 92% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/Part-I.md index 5394890f8d..afb1afc069 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-I.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/Part-I.md @@ -16,7 +16,7 @@ ### 创建项目 -创建一个名为`Acme.BookStore`的新项目, 创建数据库并按照[入门文档](../../Getting-Started-AspNetCore-MVC-Template.md)运行应用程序. +创建一个名为`Acme.BookStore`的新项目, 创建数据库并按照[入门文档](../../../Getting-Started-AspNetCore-MVC-Template.md)运行应用程序. ### 解决方案的结构 @@ -24,16 +24,16 @@ ![bookstore-visual-studio-solution](images/bookstore-visual-studio-solution-v3.png) -> 你可以查看[应用程序模板文档](../../Startup-Templates/Application.md)以详细了解解决方案结构.但是,你将通过本教程了解基础知识. +> 你可以查看[应用程序模板文档](../../../Startup-Templates/Application.md)以详细了解解决方案结构.但是,你将通过本教程了解基础知识. ### 创建Book实体 启动模板中的域层分为两个项目: - - `Acme.BookStore.Domain`包含你的[实体](../../Entities.md), [领域服务](../../Domain-Services.md)和其他核心域对象. + - `Acme.BookStore.Domain`包含你的[实体](../../../Entities.md), [领域服务](../../../Domain-Services.md)和其他核心域对象. - `Acme.BookStore.Domain.Shared`包含可与客户共享的常量,枚举或其他域相关对象. -在解决方案的**领域层**(`Acme.BookStore.Domain`项目)中定义[实体](../../Entities.md). 该应用程序的主要实体是`Book`. 在`Acme.BookStore.Domain`项目中创建一个名为`Book`的类,如下所示: +在解决方案的**领域层**(`Acme.BookStore.Domain`项目)中定义[实体](../../../Entities.md). 该应用程序的主要实体是`Book`. 在`Acme.BookStore.Domain`项目中创建一个名为`Book`的类,如下所示: ````C# using System; @@ -66,7 +66,7 @@ namespace Acme.BookStore } ```` -* ABP为实体提供了两个基本的基类: `AggregateRoot`和`Entity`. **Aggregate Root**是**域驱动设计(DDD)** 概念之一. 有关详细信息和最佳做法,请参阅[实体文档](../../Entities.md). +* ABP为实体提供了两个基本的基类: `AggregateRoot`和`Entity`. **Aggregate Root**是**域驱动设计(DDD)** 概念之一. 有关详细信息和最佳做法,请参阅[实体文档](../../../Entities.md). * `Book`实体继承了`AuditedAggregateRoot`,`AuditedAggregateRoot`类在`AggregateRoot`类的基础上添加了一些审计属性(`CreationTime`, `CreatorId`, `LastModificationTime` 等). * `Guid`是`Book`实体的主键类型. * 使用 **数据注解** 为EF Core添加映射.或者你也可以使用 EF Core 自带的[fluent mapping API](https://docs.microsoft.com/en-us/ef/core/modeling). @@ -138,7 +138,7 @@ PM> Update-Database ### 创建应用服务 -下一步是创建[应用服务](../../Application-Services.md)来管理(创建,列出,更新,删除)书籍. 启动模板中的应用程序层分为两个项目: +下一步是创建[应用服务](../../../Application-Services.md)来管理(创建,列出,更新,删除)书籍. 启动模板中的应用程序层分为两个项目: * `Acme.BookStore.Application.Contracts`主要包含你的DTO和应用程序服务接口. * `Acme.BookStore.Application`包含应用程序服务的实现. @@ -166,7 +166,7 @@ namespace Acme.BookStore } ```` -* **DTO**类被用来在 **表示层** 和 **应用层** **传递数据**.查看[DTO文档](../../Data-Transfer-Objects.md)查看更多信息. +* **DTO**类被用来在 **表示层** 和 **应用层** **传递数据**.查看[DTO文档](../../../Data-Transfer-Objects.md)查看更多信息. * 为了在页面上展示书籍信息,`BookDto`被用来将书籍数据传递到表示层. * `BookDto`继承自 `AuditedEntityDto`.跟上面定义的`Book`类一样具有一些审计属性. @@ -217,7 +217,7 @@ namespace Acme.BookStore ```` * 这个DTO类被用于在创建或更新书籍的时候从用户界面获取图书信息. -* 它定义了数据注释属性(如`[Required]`)来定义属性的验证. DTO由ABP框架[自动验证](../../Validation.md). +* 它定义了数据注释属性(如`[Required]`)来定义属性的验证. DTO由ABP框架[自动验证](../../../Validation.md). 就像上面的`BookDto`一样,创建一个从`CreateUpdateBookDto`对象到`Book`实体的映射: @@ -281,12 +281,12 @@ namespace Acme.BookStore ```` * `BookAppService`继承了`CrudAppService<...>`.它实现了上面定义的CRUD方法. -* `BookAppService`注入`IRepository `,这是`Book`实体的默认仓储. ABP自动为每个聚合根(或实体)创建默认仓储. 请参阅[仓储文档](../../Repositories.md) +* `BookAppService`注入`IRepository `,这是`Book`实体的默认仓储. ABP自动为每个聚合根(或实体)创建默认仓储. 请参阅[仓储文档](../../../Repositories.md) * `BookAppService`使用`IObjectMapper`将`Book`对象转换为`BookDto`对象, 将`CreateUpdateBookDto`对象转换为`Book`对象. 启动模板使用[AutoMapper](http://automapper.org/)库作为对象映射提供程序. 你之前定义了映射, 因此它将按预期工作. ### 自动生成API Controllers -你通常创建**Controller**以将应用程序服务公开为**HTTP API**端点. 因此允许浏览器或第三方客户端通过AJAX调用它们. ABP可以[**自动**](../../AspNetCore/Auto-API-Controllers.md)按照惯例将你的应用程序服务配置为MVC API控制器. +你通常创建**Controller**以将应用程序服务公开为**HTTP API**端点. 因此允许浏览器或第三方客户端通过AJAX调用它们. ABP可以[**自动**](../../../AspNetCore/Auto-API-Controllers.md)按照惯例将你的应用程序服务配置为MVC API控制器. #### Swagger UI @@ -392,7 +392,7 @@ context.Menu.AddItem( } ```` -* ABP的本地化功能建立在[ASP.NET Core's standard localization]((https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization))之上并增加了一些扩展.查看[本地化文档](../../Localization.md). +* ABP的本地化功能建立在[ASP.NET Core's standard localization]((https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization))之上并增加了一些扩展.查看[本地化文档](../../../Localization.md). * 本地化key是任意的. 你可以设置任何名称. 我们更喜欢为菜单项添加`Menu:`前缀以区别于其他文本. 如果未在本地化文件中定义文本,则它将**返回**到本地化的key(ASP.NET Core的标准行为). 运行该应用程序,看到新菜单项已添加到顶部栏: @@ -437,8 +437,8 @@ context.Menu.AddItem( ```` -* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro)用于将外部的 **脚本** 添加到页面中.它比标准的`script`标签多了很多额外的功能.它可以处理 **最小化**和 **版本**.查看[捆绑 & 压缩文档](../../AspNetCore/Bundling-Minification.md)获取更多信息. -* `abp-card` 和 `abp-table` 是为Twitter Bootstrap的[card component](http://getbootstrap.com/docs/4.1/components/card/)封装的 **tag helpers**.ABP中有很多tag helpers,可以很方便的使用大多数[bootstrap](https://getbootstrap.com/)组件.你也可以使用原生的HTML标签代替tag helpers.使用tag helper可以通过智能提示和编译时类型检查减少HTML代码并防止错误.查看[tag helpers 文档](../../AspNetCore/Tag-Helpers/Index.md). +* `abp-script` [tag helper](https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro)用于将外部的 **脚本** 添加到页面中.它比标准的`script`标签多了很多额外的功能.它可以处理 **最小化**和 **版本**.查看[捆绑 & 压缩文档](../../../AspNetCore/Bundling-Minification.md)获取更多信息. +* `abp-card` 和 `abp-table` 是为Twitter Bootstrap的[card component](http://getbootstrap.com/docs/4.1/components/card/)封装的 **tag helpers**.ABP中有很多tag helpers,可以很方便的使用大多数[bootstrap](https://getbootstrap.com/)组件.你也可以使用原生的HTML标签代替tag helpers.使用tag helper可以通过智能提示和编译时类型检查减少HTML代码并防止错误.查看[tag helpers 文档](../../../AspNetCore/Tag-Helpers/Index.md). * 你可以像上面本地化菜单一样 **本地化** 列名. #### 添加脚本文件 diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/Part-II.md similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-II.md rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/Part-II.md diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/Part-III.md similarity index 99% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/Part-III.md index e48cf6b710..a5e51134fa 100644 --- a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Part-III.md +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/Part-III.md @@ -68,7 +68,7 @@ namespace Acme.BookStore ```` * 注入`IRepository`并在`SeedAsync`中使用它来创建两个书实体作为测试数据. -* 使用`IGuidGenerator`服务创建GUID. 虽然`Guid.NewGuid()`非常适合测试,但`IGuidGenerator`在使用真实数据库时还有其他特别重要的功能(参见[Guid生成文档](../../Guid-Generation.md)了解更多信息). +* 使用`IGuidGenerator`服务创建GUID. 虽然`Guid.NewGuid()`非常适合测试,但`IGuidGenerator`在使用真实数据库时还有其他特别重要的功能(参见[Guid生成文档](../../../Guid-Generation.md)了解更多信息). ### 测试 BookAppService diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-add-create-dialog-v2.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-edit-dialog.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-add-edit-dialog.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-edit-dialog.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-add-edit-dialog.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-add-index-page-v2.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-appservice-tests.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-appservice-tests.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-appservice-tests.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-appservice-tests.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-book-list-2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-book-list-2.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-book-list-2.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-book-list-2.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-book-list.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-book-list.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-book-list.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-book-list.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-books-table-actions.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-books-table-actions.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-books-table-actions.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-books-table-actions.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-books-table.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-books-table.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-books-table.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-books-table.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog-2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-create-dialog-2.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog-2.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-create-dialog-2.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-create-dialog.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-create-dialog.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-create-dialog.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-create-template.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-create-template.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-create-template.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-create-template.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-homepage.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-homepage.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-homepage.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-homepage.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-index-js-file-v2.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-localization-files-v2.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-localization-files-v2.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-localization-files-v2.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-menu-items.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-menu-items.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-menu-items.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-menu-items.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-new-book-button.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-new-book-button.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-new-book-button.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-new-book-button.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration-v2.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration-v2.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration-v2.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-pmc-add-book-migration.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-swagger.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-swagger.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-swagger.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-swagger.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist-network.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist-network.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist-network.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist-network.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-test-js-proxy-getlist.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-test-projects-v2.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-test-projects-v2.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-test-projects-v2.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-user-management.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-user-management.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-user-management.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-user-management.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png similarity index 100% rename from docs/zh-Hans/Tutorials/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png rename to docs/zh-Hans/Tutorials/AspNetCore-Mvc/AspNetCore-Mvc/images/bookstore-visual-studio-solution-v3.png diff --git a/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Index.md b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Index.md new file mode 100644 index 0000000000..f7eea987e4 --- /dev/null +++ b/docs/zh-Hans/Tutorials/AspNetCore-Mvc/Index.md @@ -0,0 +1,6 @@ +# 教程 + +## 应用开发 + +* [使用ASP.NET Core MVC/ Razor Pages UI](AspNetCore-Mvc/Part-I.md) +* [使用Angular UI](Angular/Part-I.md) diff --git a/docs/zh-Hans/docs-nav.json b/docs/zh-Hans/docs-nav.json index ad811cc5b3..63d223b1b5 100644 --- a/docs/zh-Hans/docs-nav.json +++ b/docs/zh-Hans/docs-nav.json @@ -29,6 +29,7 @@ }, { "text": "教程", + "path": "Tutorials/Index.md", "items": [ { "text": "应用开发", @@ -277,20 +278,22 @@ "path": "Entity-Framework-Core.md", "items": [ { - "text": "切换到MySql", - "path": "Entity-Framework-Core-MySQL.md" - }, - { - "text": "切换到PostgreSQL", - "path": "Entity-Framework-Core-PostgreSQL.md" - }, - { - "text": "切换到SQLite", - "path": "Entity-Framework-Core-SQLite.md" - }, - { - "text": "切换到其他DBMS", - "path": "Entity-Framework-Core-Other-DBMS.md" + "text": "切换DMBS", + "path": "Entity-Framework-Core-Other-DBMS.md", + "items":[ + { + "text": "到MySql", + "path": "Entity-Framework-Core-MySQL.md" + }, + { + "text": "到PostgreSQL", + "path": "Entity-Framework-Core-PostgreSQL.md" + }, + { + "text": "到SQLite", + "path": "Entity-Framework-Core-SQLite.md" + } + ] } ] }, From cb6dedf324919e6a856d0a8837f38ed487914eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 25 Feb 2020 08:13:22 +0300 Subject: [PATCH 21/22] Added MigrationsDbContext section. --- docs/en/Entity-Framework-Core-Migrations.md | 133 +++++++++++++++++++- 1 file changed, 130 insertions(+), 3 deletions(-) diff --git a/docs/en/Entity-Framework-Core-Migrations.md b/docs/en/Entity-Framework-Core-Migrations.md index eb3125c13b..b17fc99242 100644 --- a/docs/en/Entity-Framework-Core-Migrations.md +++ b/docs/en/Entity-Framework-Core-Migrations.md @@ -85,9 +85,9 @@ From the database point of view, there are three important projects those will b #### .EntityFrameworkCore Project -This project has the `DbContext` class (`BookStoreDbContext` for this sample) of your application. You typically use this `DbContext` in your application code (in your custom [repositories](Repositories.md) if you follow the best practices). +This project has the `DbContext` class (`BookStoreDbContext` for this sample) of your application. -It is almost an empty `DbContext` since your application don't have any entities at the beginning, except the pre-defined `AppUser` entity: +Every module uses its own `DbContext` class to access to the database. Likewise, your application has its own `DbContext`. You typically use this `DbContext` in your application code (in your custom [repositories](Repositories.md) if you follow the best practices). It is almost an empty `DbContext` since your application don't have any entities at the beginning, except the pre-defined `AppUser` entity: ````csharp [ConnectionStringName("Default")] @@ -136,11 +136,138 @@ This simple `DbContext` class still needs some explanations: * The constructor takes a `DbContextOptions` instance. * It overrides the `OnModelCreating` method to define the EF Core mappings. * It first calls the the `base.OnModelCreating` method to let the ABP Framework to implement the base mappings for us. - * It then configures the mapping for the `AppUser` entity. There is a special case for this entity, which will be explained in the next sections. + * It then configures the mapping for the `AppUser` entity. There is a special case for this entity (it shares a table with the Identity module), which will be explained in the next sections. * It finally calls the `builder.ConfigureBookStore()` extension method to configure other entities of your application. This design will be explained in more details after introducing the other database related projects. #### .EntityFrameworkCore.DbMigrations Project +As mentioned in the previous section, every module (and your application) have **their own** separate `DbContext` classes. Each `DbContext` class only defines the entity to table mappings related to its own module and each module (and your application) use the related `DbContext` class **on runtime**. + +As you know, EF Core Code First migration system relies on a `DbContext` class **to track and generate** the code first migrations. So, which `DbContext` we should use for the migrations? The answer is *none of them*. There is another `DbContext` defined in the `.EntityFrameworkCore.DbMigrations` project (which is the `BookStoreMigrationsDbContext` for this example solution). + +##### The MigrationsDbContext + +The `MigrationsDbContext` is only used to create and apply the database migrations. It is **not used on runtime**. It **merges** all the entity to table mappings of all the used modules plus the application's mappings. + +In this way, you create and maintain a **single database migration path**. However, there are some difficulties of this approach and the next sections explains how ABP Framework overcomes these difficulties. But first, see the `BookStoreMigrationsDbContext` class as an example: + +````csharp +/* This DbContext is only used for database migrations. + * It is not used on runtime. See BookStoreDbContext for the runtime DbContext. + * It is a unified model that includes configuration for + * all used modules and your application. + */ +public class BookStoreMigrationsDbContext : AbpDbContext +{ + public BookStoreMigrationsDbContext( + DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + /* Include modules to your migration db context */ + builder.ConfigurePermissionManagement(); + builder.ConfigureSettingManagement(); + builder.ConfigureBackgroundJobs(); + builder.ConfigureAuditLogging(); + builder.ConfigureIdentity(); + builder.ConfigureIdentityServer(); + builder.ConfigureFeatureManagement(); + builder.ConfigureTenantManagement(); + + /* Configure customizations for entities from the modules included */ + builder.Entity(b => + { + b.ConfigureCustomUserProperties(); + }); + + /* Configure your own tables/entities inside the ConfigureBookStore method */ + builder.ConfigureBookStore(); + } +} +```` + +##### Sharing the Mapping Code + +First problem is that: A module uses its own `DbContext` which needs to the database mappings. The `MigrationsDbContext` also needs to the same mapping in order to create the database tables for this module. We definitely don't want to duplicate the mapping code. + +The solution is to define an extension method (on the `ModelBuilder`) that can be called by both `DbContext` classes. So, every module defines such an extension method. + +For example, the `builder.ConfigureBackgroundJobs()` method call configures the database tables for the [Background Jobs module](Modules/Background-Jobs.md). The definition of this extension method is something like that: + +````csharp +public static class BackgroundJobsDbContextModelCreatingExtensions +{ + public static void ConfigureBackgroundJobs( + this ModelBuilder builder, + Action optionsAction = null) + { + var options = new BackgroundJobsModelBuilderConfigurationOptions( + BackgroundJobsDbProperties.DbTablePrefix, + BackgroundJobsDbProperties.DbSchema + ); + + optionsAction?.Invoke(options); + + builder.Entity(b => + { + b.ToTable(options.TablePrefix + "BackgroundJobs", options.Schema); + + b.ConfigureCreationTime(); + b.ConfigureExtraProperties(); + + b.Property(x => x.JobName) + .IsRequired() + .HasMaxLength(BackgroundJobRecordConsts.MaxJobNameLength); + + //... + }); + } +} +```` + +This extension method also gets options to change the database table prefix and schema for this module, but it is not important here. + +The final application calls the extension methods inside the `MigrationsDbContext` class, so it can decide which modules are included to the database maintained by this `MigrationsDbContext`. If you want to create a second database and move some module tables to the second database, then you need to have a second `MigrationsDbContext` class which only calls the extension methods of the related modules. This topic will be detailed in the next sections. + +The same `ConfigureBackgroundJobs` method is also called the `DbContext` of the Background Jobs module: + +````csharp +[ConnectionStringName(BackgroundJobsDbProperties.ConnectionStringName)] +public class BackgroundJobsDbContext + : AbpDbContext, IBackgroundJobsDbContext +{ + public DbSet BackgroundJobs { get; set; } + + public BackgroundJobsDbContext(DbContextOptions options) + : base(options) + { + + } + + protected override void OnModelCreating(ModelBuilder builder) + { + base.OnModelCreating(builder); + + //Reuse the same extension method! + builder.ConfigureBackgroundJobs(); + } +} +```` + +In this way, the mapping configuration of a module can be shared between `DbContext` classes. + +##### Reusing a Table Defined by a Module + +TODO + +##### Discussion of an Alternative Scenario: Every Module Manages Its Own Migration Path + TODO \ No newline at end of file From 4a638a73e156c73c18c06121644a69a1a39c41df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Tue, 25 Feb 2020 08:55:33 +0300 Subject: [PATCH 22/22] Added new section: Reusing a Table of a Module --- docs/en/Entity-Framework-Core-Migrations.md | 44 ++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/docs/en/Entity-Framework-Core-Migrations.md b/docs/en/Entity-Framework-Core-Migrations.md index b17fc99242..e17881b08d 100644 --- a/docs/en/Entity-Framework-Core-Migrations.md +++ b/docs/en/Entity-Framework-Core-Migrations.md @@ -264,7 +264,49 @@ public class BackgroundJobsDbContext In this way, the mapping configuration of a module can be shared between `DbContext` classes. -##### Reusing a Table Defined by a Module +##### Reusing a Table of a Module + +You may want to reuse a table of a depended module in your application. In this case, you have two options: + +1. You can directly use the entity defined by the module. +2. You can create a new entity mapping to the same database table. + +###### Use the Entity Defined by a Module + +Using an entity defined a module is pretty easy and standard. For example, Identity module defines the `IdentityUser` entity. You can inject the [repository](Repositories.md) for the `IdentityUser` and perform the standard repository operations for this entity. Example: + +````csharp +using System; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Volo.Abp.Identity; + +namespace Acme.BookStore +{ + public class MyService : ITransientDependency + { + private readonly IRepository _identityUserRepository; + + public MyService(IRepository identityUserRepository) + { + _identityUserRepository = identityUserRepository; + } + + public async Task DoItAsync() + { + //Get all users + var users = await _identityUserRepository.GetListAsync(); + } + } +} +```` + +This example injects the `IRepository` (default repository) which defines the standard repository methods and implements the `IQueryable` interface. + +In addition, Identity module defines the `IIdentityUserRepository` (custom repository) that can also be injected and used by your application. `IIdentityUserRepository` provides additional custom methods for the `IdentityUser` entity while it does not implement the `IQueryable`. + +###### Create a New Entity TODO