Base solution for your next web application

Activities of "simplexsrl"

Does anyone have a Flaticon Collection synced with Metronic owned, that should be used to extend with custom picked icons?

Answer

After some tries and research in ANZ code, I found a solution.

Edit appsettings.json as follow:

"WsFederation": {
      "IsEnabled": "true",
      "Authority": "https://sts.windows.net/{azureTenantId}/",
      "ClientId": "<GET IT FROM AZURE PORTAL>",
      "Tenant": "<GET IT FROM AZURE PORTAL>",
      "MetaDataAddress": "https://login.microsoftonline.com/{azureTenantId}/federationmetadata/2007-06/federationmetadata.xml"
    },

What is missing in your docs (and in Azure's docs too :D) is Authority property. It is not clear what is used for and where retrieve it! I found it debugging step-by-step your code and auth communication flow!

Last, you have to modify your Federation Metadata Manifest - from Azure Portal - to include the email claim otherwise ANZ auth flow can't recognize user info and goes in exception!

To do that, simply edit optionalClaims JSON property as follow:

"optionalClaims": {
    "idToken": [
        {
            "name": "email",
            "source": null,
            "essential": true,
            "additionalProperties": []
        }
    ],
    "accessToken": [
        {
            "name": "email",
            "source": null,
            "essential": true,
            "additionalProperties": []
        }
    ],
    "saml2Token": []
    },

With this modifcations, authentication flow success and user were created in ANZ! But ... there is alway a last issue ... user was created with a strange username, due to the fact that somewere in the code something failed. But this is not an issue at all, because you (admin) have to login to ANZ for activate this newly user, so at same time, you can simply change its username!

JUST A LITTLE SUGGESTION to improve the usability. Bypass CheckSelfRegistrationIsEnabled(); inside UserRegistrationManager.RegisterAsync if user comefrom an External Provider. In this way you can disable users self-registration via login page to ensure application access only to a domain's users ... like an intranet!

I did that adding an optional boolean argument to that method, that is used to conditionally call CheckSelfRegistrationIsEnabled, but I'm sure that you can do it better ... in a more fashioned way :D

Question

Hi, we are developing onto Core+Angular solution (v.6.9.0) and we configured it to login against an O365 Tenant following some suggestions found on this support portal. Btw, when Azure callback our app, following exception has been raised:

IDX10205: Issuer validation failed. Issuer: '[PII is hidden]'. Did not match: validationParameters.ValidIssuer: '[PII is hidden]' or validationParameters.ValidIssuers: '[PII is hidden]'.
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException: IDX10205: Issuer validation failed. Issuer: '[PII is hidden]'. Did not match: validationParameters.ValidIssuer: '[PII is hidden]' or validationParameters.ValidIssuers: '[PII is hidden]'.
   at Microsoft.IdentityModel.Tokens.Validators.ValidateIssuer(String issuer, SecurityToken securityToken, TokenValidationParameters validationParameters) in C:\agent2\_work\56\s\src\Microsoft.IdentityModel.Tokens\Validators.cs:line 172
   at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateTokenPayload(JwtSecurityToken jwtToken, TokenValidationParameters validationParameters) in C:\agent2\_work\56\s\src\System.IdentityModel.Tokens.Jwt\JwtSecurityTokenHandler.cs:line 737
   at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken) in C:\agent2\_work\56\s\src\System.IdentityModel.Tokens.Jwt\JwtSecurityTokenHandler.cs:line 719
   at Abp.AspNetZeroCore.Web.Authentication.External.WsFederation.WsFederationAuthProviderApi.ValidateToken(String token, String issuer, IConfigurationManager`1 configurationManager, CancellationToken ct)
   at Abp.AspNetZeroCore.Web.Authentication.External.WsFederation.WsFederationAuthProviderApi.GetUserInfo(String token)
   at SmartPortal.Web.Controllers.TokenAuthController.GetExternalUserInfo(ExternalAuthenticateModel model) in /Users/fncap/Dev/GIT/SmartPortal Project/SmartPortal/aspnet-core/src/SmartPortal.Web.Core/Controllers/TokenAuthController.cs:line 455
   at SmartPortal.Web.Controllers.TokenAuthController.ExternalAuthenticate(ExternalAuthenticateModel model) in /Users/fncap/Dev/GIT/SmartPortal Project/SmartPortal/aspnet-core/src/SmartPortal.Web.Core/Controllers/TokenAuthController.cs:line 330
   at lambda_method(Closure , Object )
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync()

Any Suggestion?

Thanks ... it was just a curiosity ;)

Ref: https://github.com/aspnetzero/aspnet-zero-core/issues/2386

Hi Support Team,

why you not considered to use (or leave to user the choice) to inherit generated AppService from AsyncCrudAppServiceBase?

I'm curious on that.

Many Thanks! I'll fix them and retry!

Another question - that I made before and in slack's chat too - I'm in a situation where I generated entities with tool and after customized them for implementing TPH. Some manual work to do, but not so much complicated.

What is "complicated", therfor, is an evenutally regeneration of Angular's file only (or .NET files too).

Imagine a scenario where entities and DTOs doesn't reflect a 1:1 relation, some DTO properties could be custom mapped to entities properties with AutoMapper or viceversa.

In that case, I'd like to use tool for regenerate only Angular's files, or .NET file with an argument passed in command line, or better solution could be what I suggested before ... using some special comment to identify tool's generated file, and if those comments are removed, file will leave intact as-is.

Many thanks for yuor attention and your great job!

EXECUTION OUTPUT

fncap$ dotnet AspNetZeroRadTool.dll ../../RAD/Common/Directory/Company.json 
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\ICompaniesAppService.cs is being generated.
-> SmartPortal.Application\Common\Directory\DirectoryItems\Exporting\CompaniesExcelExporter.cs is being generated.
-> SmartPortal.Core\Common\Directory\DirectoryItems\Company.cs is being generated.
Warning: System.Exception: Word can not be null. exiting...
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Lower(String word)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.bMbeb0mwZ4cnxO8WMkM(Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.ReplaceAlsoWithLowerCase(Object template, Object placeholder, Object value)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.XvOj3pBU9PRrU6bUaR6(Object , Object , Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Replace(String template, EntityConfiguration entity, Property property, EnumDefinition enumDefinition, NavigationProperty navigationProperty)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.SetEnums()
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.GenerateAndGetContent()
   at AspNetZeroRadTool.GeneratorFromTemplate.NPlmurbr8sqIqPi48dS(Object )
   at AspNetZeroRadTool.GeneratorFromTemplate.FileGeneratorBasedOnEntity(Object templateInfo, Object templatePathInfo, Object targetFolderRoot, Object entity)
-> SmartPortal.Application\Common\Directory\DirectoryItems\Exporting\ICompaniesExcelExporter.cs is being generated.
-> SmartPortal.Application\Common\Directory\DirectoryItems\CompaniesAppService.cs is being generated.
Warning: System.Exception: Word can not be null. exiting...
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Lower(String word)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.bMbeb0mwZ4cnxO8WMkM(Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.ReplaceAlsoWithLowerCase(Object template, Object placeholder, Object value)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.XvOj3pBU9PRrU6bUaR6(Object , Object , Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Replace(String template, EntityConfiguration entity, Property property, EnumDefinition enumDefinition, NavigationProperty navigationProperty)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.SetEnums()
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.GenerateAndGetContent()
   at AspNetZeroRadTool.GeneratorFromTemplate.NPlmurbr8sqIqPi48dS(Object )
   at AspNetZeroRadTool.GeneratorFromTemplate.FileGeneratorBasedOnEntity(Object templateInfo, Object templatePathInfo, Object targetFolderRoot, Object entity)
-> SmartPortal.Core.Shared\Common\Directory\DirectoryItems\CompanyConsts.cs is being generated.
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\GetAllForLookupTableInput.cs is being generated.
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\CompanyCompanyTypeLookupTableDto.cs is being generated.
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\CompanyVatLookupTableDto.cs is being generated.
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\CreateOrEditCompanyDto.cs is being generated.
Warning: System.Exception: Word can not be null. exiting...
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Lower(String word)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.bMbeb0mwZ4cnxO8WMkM(Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.ReplaceAlsoWithLowerCase(Object template, Object placeholder, Object value)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.XvOj3pBU9PRrU6bUaR6(Object , Object , Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Replace(String template, EntityConfiguration entity, Property property, EnumDefinition enumDefinition, NavigationProperty navigationProperty)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.SetEnums()
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.GenerateAndGetContent()
   at AspNetZeroRadTool.GeneratorFromTemplate.NPlmurbr8sqIqPi48dS(Object )
   at AspNetZeroRadTool.GeneratorFromTemplate.FileGeneratorBasedOnEntity(Object templateInfo, Object templatePathInfo, Object targetFolderRoot, Object entity)
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\GetCompanyForViewDto.cs is being generated.
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\GetAllCompaniesInput.cs is being generated.
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\GetAllCompaniesForExcelInput.cs is being generated.
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\GetCompanyForEditOutput.cs is being generated.
-> SmartPortal.Application.Shared\Common\Directory\DirectoryItems\Dtos\CompanyDto.cs is being generated.
Warning: System.Exception: Word can not be null. exiting...
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Lower(String word)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.bMbeb0mwZ4cnxO8WMkM(Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.ReplaceAlsoWithLowerCase(Object template, Object placeholder, Object value)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.XvOj3pBU9PRrU6bUaR6(Object , Object , Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Replace(String template, EntityConfiguration entity, Property property, EnumDefinition enumDefinition, NavigationProperty navigationProperty)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.SetEnums()
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.GenerateAndGetContent()
   at AspNetZeroRadTool.GeneratorFromTemplate.NPlmurbr8sqIqPi48dS(Object )
   at AspNetZeroRadTool.GeneratorFromTemplate.FileGeneratorBasedOnEntity(Object templateInfo, Object templatePathInfo, Object targetFolderRoot, Object entity)
-> \..\src\SmartPortal.Core\Authorization\AppPermissions.cs is being modified.
-> \..\src\SmartPortal.Core\Authorization\AppAuthorizationProvider.cs is being modified.
-> \..\src\SmartPortal.EntityFrameworkCore\EntityFrameworkCore\SmartPortalDbContext.cs is being modified.
-> \..\src\SmartPortal.Application\CustomDtoMapper.cs is being modified.
-> app\main\directoryItems\companies\companyType-lookup-table-modal.component.less is being generated.
-> app\main\directoryItems\companies\vat-lookup-table-modal.component.less is being generated.
-> app\main\directoryItems\companies\companyType-lookup-table-modal.component.ts is being generated.
-> app\main\directoryItems\companies\vat-lookup-table-modal.component.ts is being generated.
-> app\main\directoryItems\companies\companyType-lookup-table-modal.component.html is being generated.
-> app\main\directoryItems\companies\vat-lookup-table-modal.component.html is being generated.
-> app\main\directoryItems\companies\view-company-modal.component.ts is being generated.
Warning: System.Exception: Word can not be null. exiting...
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Lower(String word)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.bMbeb0mwZ4cnxO8WMkM(Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.ReplaceAlsoWithLowerCase(Object template, Object placeholder, Object value)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.XvOj3pBU9PRrU6bUaR6(Object , Object , Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Replace(String template, EntityConfiguration entity, Property property, EnumDefinition enumDefinition, NavigationProperty navigationProperty)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.SetEnums()
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.GenerateAndGetContent()
   at AspNetZeroRadTool.GeneratorFromTemplate.NPlmurbr8sqIqPi48dS(Object )
   at AspNetZeroRadTool.GeneratorFromTemplate.FileGeneratorBasedOnEntity(Object templateInfo, Object templatePathInfo, Object targetFolderRoot, Object entity)
-> app\main\directoryItems\companies\companies.component.ts is being generated.
Warning: System.Exception: Word can not be null. exiting...
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Lower(String word)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.bMbeb0mwZ4cnxO8WMkM(Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.ReplaceAlsoWithLowerCase(Object template, Object placeholder, Object value)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.XvOj3pBU9PRrU6bUaR6(Object , Object , Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Replace(String template, EntityConfiguration entity, Property property, EnumDefinition enumDefinition, NavigationProperty navigationProperty)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.SetEnums()
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.GenerateAndGetContent()
   at AspNetZeroRadTool.GeneratorFromTemplate.NPlmurbr8sqIqPi48dS(Object )
   at AspNetZeroRadTool.GeneratorFromTemplate.FileGeneratorBasedOnEntity(Object templateInfo, Object templatePathInfo, Object targetFolderRoot, Object entity)
-> app\main\directoryItems\companies\companies.component.html is being generated.
Warning: System.Exception: Word can not be null. exiting...
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Lower(String word)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.bMbeb0mwZ4cnxO8WMkM(Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.ReplaceAlsoWithLowerCase(Object template, Object placeholder, Object value)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.XvOj3pBU9PRrU6bUaR6(Object , Object , Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Replace(String template, EntityConfiguration entity, Property property, EnumDefinition enumDefinition, NavigationProperty navigationProperty)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.SetEnums()
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.GenerateAndGetContent()
   at AspNetZeroRadTool.GeneratorFromTemplate.NPlmurbr8sqIqPi48dS(Object )
   at AspNetZeroRadTool.GeneratorFromTemplate.FileGeneratorBasedOnEntity(Object templateInfo, Object templatePathInfo, Object targetFolderRoot, Object entity)
-> app\main\directoryItems\companies\view-company-modal.component.html is being generated.
-> app\main\directoryItems\companies\create-or-edit-company-modal.component.html is being generated.
Warning: System.Exception: Word can not be null. exiting...
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Lower(String word)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.bMbeb0mwZ4cnxO8WMkM(Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.ReplaceAlsoWithLowerCase(Object template, Object placeholder, Object value)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.XvOj3pBU9PRrU6bUaR6(Object , Object , Object )
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.PlaceholderReplacer.Replace(String template, EntityConfiguration entity, Property property, EnumDefinition enumDefinition, NavigationProperty navigationProperty)
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.SetEnums()
   at AspNetZeroRadTool.FileWizards.FileGenerators.Generic.GenericFileContentGenerator.GenerateAndGetContent()
   at AspNetZeroRadTool.GeneratorFromTemplate.NPlmurbr8sqIqPi48dS(Object )
   at AspNetZeroRadTool.GeneratorFromTemplate.FileGeneratorBasedOnEntity(Object templateInfo, Object templatePathInfo, Object targetFolderRoot, Object entity)
-> app\main\directoryItems\companies\create-or-edit-company-modal.component.ts is being generated.
-> \..\..\angular\src\app\main\main.module.ts is being modified.
-> \..\..\angular\src\app\main\main-routing.module.ts is being modified.
-> \..\..\angular\src\app\shared\layout\nav\app-navigation.service.ts is being modified.
-> \..\..\angular\src\shared\service-proxies\service-proxy.module.ts is being modified.
-> \..\src\SmartPortal.Core\Localization\SmartPortal\SmartPortal.xml is being modified.

Code generation is complete. Press ENTER to exit...

I'll give it a try, meanwhile ... is there any possibility - or plans - to use RAD Tool for generate Server-Side or Angular files only?

Imagine a scenario where you customized DTOs in a particular way that doesn't affect entities, and want to regenerate UI files

UPDATE I just tried latest AspNetZeroRadTool dlls and goes in warning without generating files. Following are definition file and an extract of output execution.

{
    "MenuPosition": "main",
    "RelativeNamespace": "Common.Directory.DirectoryItems",
    "EntityName": "Company",
    "EntityNamePlural": "Companies",
    "TableName": "Common_DirectoryItems",
    "PrimaryKeyType": "long",
    "BaseClass": "DirectoryItem",
    "AutoMigration": false,
    "UpdateDatabase": false,
    "CreateUserInterface": true,
    "CreateViewOnly": true,
    "PagePermission": {
        "Host": true,
        "Tenant": true
    },
    "Properties": [
        {
            "Name": "DisplayName",
            "Type": "string",
            "MaxLength":255,
            "MinLength":1,
            "Range": {
                "IsRangeSet": false,
                "MinimumValue": 0,
                "MaximumValue": 0
            },
            "Required": true,
            "Nullable": false,
            "Regex": "",
            "UserInterface": {
                "List": true,
                "AdvancedFilter": true,
                "CreateOrUpdate": true
            }
        },
        
        {
            "Name": "Sdi",
            "Type": "string",
            "MaxLength":7,
            "MinLength":7,
            "Range": {
                "IsRangeSet": false,
                "MinimumValue": 0,
                "MaximumValue": 0
            },
            "Required": false,
            "Nullable": true,
            "Regex": "",
            "UserInterface": {
                "List": true,
                "AdvancedFilter": true,
                "CreateOrUpdate": true
            }
        },

        {
            "Name": "UseSdi",
            "Type": "bool",
            "MaxLength":0,
            "MinLength":0,
            "Range": {
                "IsRangeSet": false,
                "MinimumValue": 0,
                "MaximumValue": 0
            },
            "Required": true,
            "Nullable": false,
            "Regex": "",
            "UserInterface": {
                "List": true,
                "AdvancedFilter": true,
                "CreateOrUpdate": true
            }
        },
        {
            "Name": "PaymentTerms",
            "Type": "int",
            "MaxLength":0,
            "MinLength":0,
            "Range": {
                "IsRangeSet": false,
                "MinimumValue": 0,
                "MaximumValue": 0
            },
            "Required": false,
            "Nullable": true,
            "Regex": "",
            "UserInterface": {
                "List": true,
                "AdvancedFilter": true,
                "CreateOrUpdate": true
            }
        },
        {
            "Name": "PaymentTermsType",
            "Type": "PaymentTermsType",
            "MaxLength":0,
            "MinLength":0,
            "Range": {
                "IsRangeSet": false,
                "MinimumValue": 0,
                "MaximumValue": 0
            },
            "Required": false,
            "Nullable": true,
            "Regex": "",
            "UserInterface": {
                "List": true,
                "AdvancedFilter": true,
                "CreateOrUpdate": true
            }
        }
    ],
    "NavigationProperties": [
        {
            "Namespace": "SmartPortal.Common.Directory.CompanyTypes",
            "ForeignEntityName": "CompanyType",
            "IdType": "int",
            "IsNullable": false,
            "PropertyName": "CompanyTypeId",
            "DisplayPropertyName": "Name",
            "DuplicationNumber": 0,
            "RelationType": "single"
        },
        {
            "Namespace": "SmartPortal.Common",
            "ForeignEntityName": "Vat",
            "IdType": "int",
            "IsNullable": true,
            "PropertyName": "VatId",
            "DisplayPropertyName": "Name",
            "DuplicationNumber": 0,
            "RelationType": "single"
        }
        
    ],
    "EnumDefinitions": [
        {
            "Namespace": "SmartPortal.Common",
            "Name": "PaymentTerms",
            "EnumProperties": [
                {
                    "Name": "GG",
                    "Value": 1
                },
                {
                    "Name": "FMDF",
                    "Value": 2
                }
            ]
        }
    ]
}

Currently I'm using embedded AspNetZeroRadTool.dll, which solution was downloaded last week, from macOS.

How can I check which version it is?

Thanks for your explanation, but honestly, I disagree with your point of view.

RAD tool is a Rapid Development tool that should avoid users to perform annoying and consuming time manual operations like creating entities, dtos, application services and - most valuable task - writing Angular's code. Obviously, this is true for those entities that are simple and for an initial development step.

In a LOB application, could be very frequent to have entities that relate to each other... and could happen - frequently too - to add new properties.

In that case, RAD is a very killer technology! If the entity doesn't have any customization (in AppService or in UI) with a bunch of seconds app is updated and ready to use newly fields!

Backing to the original problem, even if I remove duplicated class, every time I need to re-execute RAD tool, I have to remove all of the duplicated class to successfully build. This not represent a hard process, if involved entities are a few.

In addition, from a Code Quality point-of-view, is preferable to avoid unused class or interface or others because could be difficult to remember for future implementations!

A possible solution should be to avoid the creation of the LookupTableDto class (in that case) if it is already present in ForeignEntity's DTOs folder, those could respect your requirement to don't rely on existing code ... RAD should perform only a File.Exists check!

Lastly, my suggestion is to improve RAD tool using specific comments (like //RAD AUTOGENERATED CODE) to identify which files have been generated from itself and - in that way - should modify them safely!

Many thanks.

Showing 1 to 10 of 12 entries