There is still a critical issue in ABP Suite that won't let you generate Entities with one-on-one relationships.
If I create a RelatedEntities in ABP Suite with any property and generate it and then create a MasterEntity with a relationship of 1-1 with RelatedEntities and try to generate it using ABP Suite. I will get the following error.
Related to this. If you create a Master-Detail Entity, the detail entity doesn't generate any test project or it's added to the master entity test project.
There is still a critical issue in ABP Suite that won't let you generate Entities with one-on-one relationships.
If I create a RelatedEntities in ABP Suite with any property and generate it and then create a MasterEntity with a relationship of 1-1 with RelatedEntities and try to generate it using ABP Suite. I will get the following error.
Found another bug in ABP.Suite 8.0.0.rc-3
When you try to generate an Entity with a one-to-many relationship. It tries to locate a test class in the wrong place.
It tries to locate in Demo.TestBase folder instead of Demo.Domain.Tests folder
Could not find a part of the path 'C:\Users\User\Documents\GitHub\demo\demo-web-mvc\modules\Demo\test\Demo.TestBase\Demo\DemoDataSeedContributor.cs'.
System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Users\User\Documents\GitHub\demo\demo-web-mvc\modules\Demo\test\Demo.TestBase\Demo\DemoDataSeedContributor.cs'.
at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
at System.IO.StreamReader.ValidateArgsAndOpenPath(String path, Encoding encoding, Int32 bufferSize)
at System.IO.File.OpenText(String path)
at Volo.Abp.IO.FileHelper.ReadAllTextAsync(String path) in D:\ci\Jenkins\workspace\abp-volo-release\abp\framework\src\Volo.Abp.Core\Volo\Abp\IO\FileHelper.cs:line 59
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.UnitTestCommandCommand.kKU8AbY4LZ(String )
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.UnitTestCommandCommand.ThA8R0QUdt(TestDataObject , Int32 )
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.UnitTestCommandCommand.OYG8Wvo7Rq()
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.UnitTestCommandCommand.ExecuteAsync(CrudPageCommandOptions options)
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.CommandManager.ExecuteAllAsync(CrudPageCommandOptions options)
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.CrudPageGenerator.GenerateAsync(EntityModel entity, Solution solution, EntityModel masterEntity)
at Volo.Abp.Suite.Controllers.CrudPageGeneratorController.SaveAndGenerateEntityAsync(Guid solutionId, EntityModel entity)
at lambda_method1948(Closure, Object)
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
I have a situation with ABP Suite. Even when you change the default order of a newly created Entity. It doesn't generate any code related to the Sorting of the selected property. Could you please review that?
In the new Master | Detail functionality.
In the new Master | Detail functionality. The "Export to Excel" feature doesn't include Child entities in the XLSX.
in ABP Suite 8.0.0.rc-3
There is another issue in the generated Index.js
In the Init DataGrid for child entities, the viewURL and scriptUrl doesn't include the Project Name.
Using the template system to temporary fix this.
In template: Frontend.Mvc.Page.Partials.index.js_InitChildDataGridMethod.txt Now:
function init%%child-entity-name%%Grid(data) {
if(!abp.auth.isGranted("%%only-project-name%%.%%child-entity-name-plural%%")) {
return;
}
var %%entity-name-camelcase%%Id = data%%<if:HasNavigationProperties>%%.%%entity-name-camelcase%%%%</if:HasNavigationProperties>%%.id;
%%<if:IsTieredArchitecture>%%var %%child-entity-name-camelcase%%Service = window.%%solution-namespace-camelcase%%.controllers.%%child-entity-namespace-camelcase%%.%%child-entity-name-camelcase%%;%%</if:IsTieredArchitecture>%%
%%<if:IsNonTieredArchitecture>%%var %%child-entity-name-camelcase%%Service = window.%%solution-namespace-camelcase%%.%%child-entity-namespace-camelcase%%.%%<if:IsModule>%%%%child-entity-name-camelcase%%%%</if:IsModule>%%%%<if:IsNonModule>%%%%child-entity-name-plural-camelcase%%%%</if:IsNonModule>%%;%%</if:IsNonTieredArchitecture>%%
var %%child-entity-name-camelcase%%CreateModal = new abp.ModalManager({
viewUrl: abp.appPath + "%%child-entity-name-plural%%/CreateModal",
scriptUrl: abp.appPath + "Pages/%%child-entity-name-plural%%/createModal.js",
modalClass: "%%child-entity-name-camelcase%%Create"
});
var %%child-entity-name-camelcase%%EditModal = new abp.ModalManager({
viewUrl: abp.appPath + "%%child-entity-name-plural%%/EditModal",
scriptUrl: abp.appPath + "Pages/%%child-entity-name-plural%%/editModal.js",
modalClass: "%%child-entity-name-camelcase%%Edit"
});
var %%child-entity-name-camelcase%%DataTable = $("#%%child-entity-name-plural%%Table-" + %%entity-name-camelcase%%Id).DataTable(abp.libs.datatables.normalizeConfiguration({
processing: true,
serverSide: true,
paging: true,
searching: false,
scrollX: true,
autoWidth: true,
scrollCollapse: true,
order: [[1, "asc"]],
ajax: abp.libs.datatables.createAjax(%%child-entity-name-camelcase%%Service.getList%%child-navigation-properties%%By%%entity-name%%Id, {
%%entity-name-camelcase%%Id: %%entity-name-camelcase%%Id,
maxResultCount: 5
}),
columnDefs: [
{
rowAction: {
items:
[
{
text: l("Edit"),
visible: abp.auth.isGranted('%%only-project-name%%.%%child-entity-name-plural%%.Edit'),
action: function (data) {
%%child-entity-name-camelcase%%EditModal.open({
id: data.record%%include-navigation-property%%.id
});
}
},
{
text: l("Delete"),
visible: abp.auth.isGranted('%%only-project-name%%.%%child-entity-name-plural%%.Delete'),
confirmMessage: function () {
return l("DeleteConfirmationMessage");
},
action: function (data) {
%%child-entity-name-camelcase%%Service.delete(data.record%%include-navigation-property%%.id)
.then(function () {
abp.notify.info(l("SuccessfullyDeleted"));
%%child-entity-name-camelcase%%DataTable.ajax.reloadEx();
});
}
}
]
},
width: "1rem"
},
%%index-js-TableProperties%%%%table-navigation-property-fields%%
]
}));
%%child-entity-name-camelcase%%CreateModal.onResult(function () {
%%child-entity-name-camelcase%%DataTable.ajax.reloadEx();
});
%%child-entity-name-camelcase%%EditModal.onResult(function () {
%%child-entity-name-camelcase%%DataTable.ajax.reloadEx();
});
$("#New%%child-entity-name%%Button").click(function (e) {
e.preventDefault();
%%child-entity-name-camelcase%%CreateModal.open({
%%entity-name-camelcase%%Id: $(this).data("%%entity-name-camelcase%%-id")
});
});
}
Should be:
function init%%child-entity-name%%Grid(data) {
if(!abp.auth.isGranted("%%only-project-name%%.%%child-entity-name-plural%%")) {
return;
}
var %%entity-name-camelcase%%Id = data%%<if:HasNavigationProperties>%%.%%entity-name-camelcase%%%%</if:HasNavigationProperties>%%.id;
%%<if:IsTieredArchitecture>%%var %%child-entity-name-camelcase%%Service = window.%%solution-namespace-camelcase%%.controllers.%%child-entity-namespace-camelcase%%.%%child-entity-name-camelcase%%;%%</if:IsTieredArchitecture>%%
%%<if:IsNonTieredArchitecture>%%var %%child-entity-name-camelcase%%Service = window.%%solution-namespace-camelcase%%.%%child-entity-namespace-camelcase%%.%%<if:IsModule>%%%%child-entity-name-camelcase%%%%</if:IsModule>%%%%<if:IsNonModule>%%%%child-entity-name-plural-camelcase%%%%</if:IsNonModule>%%;%%</if:IsNonTieredArchitecture>%%
var %%child-entity-name-camelcase%%CreateModal = new abp.ModalManager({
viewUrl: abp.appPath + "%%only-project-name%%/%%child-entity-name-plural%%/CreateModal",
scriptUrl: abp.appPath + "Pages/%%only-project-name%%/%%child-entity-name-plural%%/createModal.js",
modalClass: "%%child-entity-name-camelcase%%Create"
});
var %%child-entity-name-camelcase%%EditModal = new abp.ModalManager({
viewUrl: abp.appPath + "%%only-project-name%%/%%child-entity-name-plural%%/EditModal",
scriptUrl: abp.appPath + "Pages/%%only-project-name%%/%%child-entity-name-plural%%/editModal.js",
modalClass: "%%child-entity-name-camelcase%%Edit"
});
var %%child-entity-name-camelcase%%DataTable = $("#%%child-entity-name-plural%%Table-" + %%entity-name-camelcase%%Id).DataTable(abp.libs.datatables.normalizeConfiguration({
processing: true,
serverSide: true,
paging: true,
searching: false,
scrollX: true,
autoWidth: true,
scrollCollapse: true,
order: [[1, "asc"]],
ajax: abp.libs.datatables.createAjax(%%child-entity-name-camelcase%%Service.getList%%child-navigation-properties%%By%%entity-name%%Id, {
%%entity-name-camelcase%%Id: %%entity-name-camelcase%%Id,
maxResultCount: 5
}),
columnDefs: [
{
rowAction: {
items:
[
{
text: l("Edit"),
visible: abp.auth.isGranted('%%only-project-name%%.%%child-entity-name-plural%%.Edit'),
action: function (data) {
%%child-entity-name-camelcase%%EditModal.open({
id: data.record%%include-navigation-property%%.id
});
}
},
{
text: l("Delete"),
visible: abp.auth.isGranted('%%only-project-name%%.%%child-entity-name-plural%%.Delete'),
confirmMessage: function () {
return l("DeleteConfirmationMessage");
},
action: function (data) {
%%child-entity-name-camelcase%%Service.delete(data.record%%include-navigation-property%%.id)
.then(function () {
abp.notify.info(l("SuccessfullyDeleted"));
%%child-entity-name-camelcase%%DataTable.ajax.reloadEx();
});
}
}
]
},
width: "1rem"
},
%%index-js-TableProperties%%%%table-navigation-property-fields%%
]
}));
%%child-entity-name-camelcase%%CreateModal.onResult(function () {
%%child-entity-name-camelcase%%DataTable.ajax.reloadEx();
});
%%child-entity-name-camelcase%%EditModal.onResult(function () {
%%child-entity-name-camelcase%%DataTable.ajax.reloadEx();
});
$("#New%%child-entity-name%%Button").click(function (e) {
e.preventDefault();
%%child-entity-name-camelcase%%CreateModal.open({
%%entity-name-camelcase%%Id: $(this).data("%%entity-name-camelcase%%-id")
});
});
}
in ABP Suite 8.0.0.rc-3
In the Master Controller file. The path of the generated _ChildDataGrids.cshtml is wrong. It doesn't include the Module name so It will fail
Now
public class DemosController : AbpController
{
[HttpGet]
public virtual async Task<PartialViewResult> ChildDataGrid(Guid demoId)
{
return PartialView("~/Pages/Shared/Guias/_ChildDataGrids.cshtml", demoId);
}
}
Should be
public class DemosController : AbpController
{
[HttpGet]
public virtual async Task<PartialViewResult> ChildDataGrid(Guid demoId)
{
return PartialView("~/Pages/MYMODULE/Shared/Guias/_ChildDataGrids.cshtml", demoId);
}
}
in ABP Suite 8.0.0.rc-3
When you generate code for a DETAIL entity. The namespace added in the MASTER entity code is not the one defined in the DETAIL.json file instead It uses the following structure [PROJECT_NAME].[DETAIL_PLURAL_NAME].
It should be [PROJECT_NAME].[DETAIL_NAMESPACE]
Note: In some MASTER entities. The child namespace is missing.