(<%= asModel(entityClassName) %>.<%= relation.relationshipFieldNamePascalizedPlural %>.Select(<%= relation.otherEntityNameLowerCased %> => <%= relation.otherEntityNameLowerCased %>.Id));
<%_ }
}); _%>
}
}
+
private void Back()
{
NavigationService.Previous();
@@ -87,10 +105,18 @@ namespace <%= namespace %>.Client.Pages.Entities.<%= entityClassName %>
private async Task Save()
{
<%_ relationships.forEach(relation => {
- if(relation.relationshipType === 'one-to-one') { _%>
- <%= asModel(entityClassName) %>.<%= relation.otherEntityNamePascalized %> = <%= relation.otherEntityNamePascalized %>Id != 0 ? new <%= asModel(relation.otherEntityNamePascalized) %> { Id = <%= relation.otherEntityNamePascalized %>Id } : null;
- <%_ }
- }); _%>
+ if (relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one') { _%>
+ <%= asModel(entityClassName) %>.<%= relation.relationshipFieldNamePascalized %> = <%= relation.otherEntityNamePascalized %>Id != 0 ? <%= relation.relationshipFieldNamePascalizedPlural %>.SingleOrDefault(<%= relation.otherEntityNameLowerCased %> => <%= relation.otherEntityNameLowerCased %>.Id.Equals(<%= relation.otherEntityNamePascalized %>Id)) : null;
+ <%_ } else if ((relation.relationshipType === 'many-to-many' || relation.relationshipType === 'one-to-many') && relation.ownerSide === true ) { _%>
+ if (Selected<%= relation.relationshipFieldNamePascalizedPlural %> != null)
+ {
+ <%= asModel(entityClassName) %>.<%= relation.relationshipFieldNamePascalizedPlural %> = <%= relation.relationshipFieldNamePascalizedPlural %>?.Where(<%= relation.otherEntityNameLowerCased %> => Selected<%= relation.relationshipFieldNamePascalizedPlural %>.Contains(<%= relation.otherEntityNameLowerCased %>.Id)).ToList();
+ }
+ else
+ {
+ <%= asModel(entityClassName) %>.<%= relation.relationshipFieldNamePascalizedPlural %> = null;
+ }
+ <%_ }}); _%>
if (Id != 0)
{
await <%= entityClassName %>Service.Update(<%= asModel(entityClassName) %>);
diff --git a/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/EntityUpdate.razor.ejs b/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/EntityUpdate.razor.ejs
index 4719953ed..e982a87f3 100644
--- a/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/EntityUpdate.razor.ejs
+++ b/generators/entity-client/templates/blazor/src/Project.Client/Pages/Entities/Entity/EntityUpdate.razor.ejs
@@ -30,22 +30,30 @@ _%>
}
<%_ fields.forEach(field => { _%>
+ <%_ if (field.fieldIsEnum) { _%>
+
+ <%_ } else { _%>
.<%= field.fieldNamePascalized %>" />
+ @bind-value="@<%= asModel(entityClassName) %>.<%= field.fieldNamePascalized %>" />
- <%_ }); _%>
+ <%_ }
+ }); _%>
<%_ relationships.forEach(relation => {
- if(relation.relationshipType === 'one-to-one') { _%>
+ if (relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one') { _%>
-
+
+ <%_ } else if ((relation.relationshipType === 'many-to-many' || relation.relationshipType === 'one-to-many') && relation.ownerSide === true ) { _%>
+
+
+
+
<%_ }
}); _%>
diff --git a/generators/entity-client/templates/blazor/src/Project.Client/Services/EntityServices/EntityService/EntityService.cs.ejs b/generators/entity-client/templates/blazor/src/Project.Client/Services/EntityServices/EntityService/EntityService.cs.ejs
index 664b2b6b4..5fc082375 100644
--- a/generators/entity-client/templates/blazor/src/Project.Client/Services/EntityServices/EntityService/EntityService.cs.ejs
+++ b/generators/entity-client/templates/blazor/src/Project.Client/Services/EntityServices/EntityService/EntityService.cs.ejs
@@ -27,7 +27,7 @@ namespace <%= namespace %>.Client.Services.EntityServices.<%= entityClassName %>
public class <%= entityClassName %>Service : AbstractEntityService<<%= asModel(entityClassName) %>>,I<%= entityClassName %>Service
{
public <%= entityClassName %>Service(HttpClient httpClient, AuthenticationStateProvider authenticationStateProvider)
- : base(httpClient, authenticationStateProvider, "/api/<%= lowerCasedEntityClassPlural %>")
+ : base(httpClient, authenticationStateProvider, "/api/<%= kebabCasedEntityClassPlural %>")
{
}
}
diff --git a/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityDetailTest.cs.ejs b/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityDetailTest.cs.ejs
index 44a9cb447..c9a2afae6 100644
--- a/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityDetailTest.cs.ejs
+++ b/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityDetailTest.cs.ejs
@@ -19,6 +19,7 @@ const entityClassName = pascalizedEntityClass;
const entityVariableName = camelCasedEntityClass;
const entityClassNamePluralized = pascalizedEntityClassPlural;
_%>
+using System.Linq;
using System.Threading.Tasks;
using AutoFixture;
using Blazorise;
@@ -55,6 +56,10 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
})
.AddBootstrapProviders()
.AddFontAwesomeIcons();
+ //This code is needed to support recursion
+ _fixture.Behaviors.OfType().ToList()
+ .ForEach(b => _fixture.Behaviors.Remove(b));
+ _fixture.Behaviors.Add(new OmitOnRecursionBehavior(1));
}
diff --git a/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityTest.cs.ejs b/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityTest.cs.ejs
index 13e10bff7..a79371770 100644
--- a/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityTest.cs.ejs
+++ b/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityTest.cs.ejs
@@ -60,6 +60,10 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
.AddBootstrapProviders()
.AddFontAwesomeIcons();
Services.AddHttpClientInterceptor();
+ //This code is needed to support recursion
+ _fixture.Behaviors.OfType().ToList()
+ .ForEach(b => _fixture.Behaviors.Remove(b));
+ _fixture.Behaviors.Add(new OmitOnRecursionBehavior(1));
}
@@ -92,7 +96,7 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
var span = <%= entityVariableName %>Page.Find("div>span");
// Assert
- span.MarkupMatches("No <%= camelCasedEntityClassPlural %> found");
+ span.MarkupMatches("No <%= entityClassNamePluralized %> found");
}
[Fact]
diff --git a/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityUpdateTest.cs.ejs b/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityUpdateTest.cs.ejs
index 9fed4d9ac..b90759875 100644
--- a/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityUpdateTest.cs.ejs
+++ b/generators/entity-client/templates/blazor/test/Project.Client.Test/Pages/Entities/Entity/EntityUpdateTest.cs.ejs
@@ -36,9 +36,11 @@ using <%= namespace %>.Client.Models;
using <%= namespace %>.Client.Pages.Utils;
using <%= namespace %>.Client.Services.EntityServices.<%= entityClassName %>;
<%_ relationships.forEach(relation => {
- if(relation.relationshipType === 'one-to-one') { _%>
+ if (relation.otherEntityNamePascalized !== entityClassName ) {
+ if (relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one' || relation.ownerSide === true) { _%>
using <%= namespace %>.Client.Services.EntityServices.<%= relation.otherEntityNamePascalized %>;
- <%_ }
+ <%_ }
+ }
}); _%>
using <%= namespace %>.Client.Shared;
using Microsoft.AspNetCore.Components;
@@ -52,10 +54,12 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
public class <%= entityClassName %>UpdateTest : TestContext
{
private readonly MockService> _<%= entityVariableName %>Service;
- <%_ relationships.forEach(relation => {
- if(relation.relationshipType === 'one-to-one') { _%>
+ <%_ relationships.forEach(relation => {
+ if (relation.otherEntityNamePascalized !== entityClassName ) {
+ if (relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one' || relation.ownerSide === true) { _%>
private readonly MockService> _<%= relation.otherEntityNameLowerCased %>Service;
- <%_ }
+ <%_ }
+ }
}); _%>
private readonly Mock _modalService;
private readonly Mock _navigationService;
@@ -67,10 +71,12 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
_modalService = new Mock();
_navigationService = new Mock();
<%_ relationships.forEach(relation => {
- if(relation.relationshipType === 'one-to-one') { _%>
+ if (relation.otherEntityNamePascalized !== entityClassName ) {
+ if (relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one' || relation.ownerSide === true) { _%>
_<%= relation.otherEntityNameLowerCased %>Service = new MockService>();
Services.AddSingletonService>(_<%= relation.otherEntityNameLowerCased %>Service.Object);
- <%_ }
+ <%_ }
+ }
}); _%>
Services.AddSingleton(_navigationService.Object);
Services.AddSingletonService>(_<%= entityVariableName %>Service.Object);
@@ -82,6 +88,10 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
.AddBootstrapProviders()
.AddFontAwesomeIcons();
Services.AddHttpClientInterceptor();
+ //This code is needed to support recursion
+ _fixture.Behaviors.OfType().ToList()
+ .ForEach(b => _fixture.Behaviors.Remove(b));
+ _fixture.Behaviors.Add(new OmitOnRecursionBehavior(1));
}
@@ -90,7 +100,10 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
{
//Arrange
<%_ relationships.forEach(relation => {
- if(relation.relationshipType === 'one-to-one') { _%>
+ if(relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one') { _%>
+ var <%= relation.otherEntityNameLowerCasedPlural %> = _fixture.CreateMany<<%= asModel(relation.otherEntityNamePascalized) %>>(10);
+ _<%= relation.otherEntityNameLowerCased %>Service.Setup(service => service.GetAll()).Returns(Task.FromResult(<%= relation.otherEntityNameLowerCasedPlural %>.ToList() as IList<<%= asModel(relation.otherEntityNamePascalized) %>>));
+ <%_ } else if ((relation.relationshipType === 'many-to-many' || relation.relationshipType === 'one-to-many') && relation.ownerSide === true ) { _%>
var <%= relation.otherEntityNameLowerCasedPlural %> = _fixture.CreateMany<<%= asModel(relation.otherEntityNamePascalized) %>>(10);
_<%= relation.otherEntityNameLowerCased %>Service.Setup(service => service.GetAll()).Returns(Task.FromResult(<%= relation.otherEntityNameLowerCasedPlural %>.ToList() as IList<<%= asModel(relation.otherEntityNamePascalized) %>>));
<%_ }
@@ -105,8 +118,8 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
// Act
- var <%= entityVariableName %>form = update<%= entityClassName %>Page.Find("form");
- <%= entityVariableName %>form.Submit();
+ var <%= entityVariableName %>Form = update<%= entityClassName %>Page.Find("form");
+ <%= entityVariableName %>Form.Submit();
// Assert
_<%= entityVariableName %>Service.Verify(service => service.Update(<%= entityVariableName %>ToUpdate),Times.Once);
@@ -117,7 +130,10 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
{
//Arrange
<%_ relationships.forEach(relation => {
- if(relation.relationshipType === 'one-to-one') { _%>
+ if(relation.relationshipType === 'one-to-one' || relation.relationshipType === 'many-to-one') { _%>
+ var <%= relation.otherEntityNameLowerCasedPlural %> = _fixture.CreateMany<<%= asModel(relation.otherEntityNamePascalized) %>>(10);
+ _<%= relation.otherEntityNameLowerCased %>Service.Setup(service => service.GetAll()).Returns(Task.FromResult(<%= relation.otherEntityNameLowerCasedPlural %>.ToList() as IList<<%= asModel(relation.otherEntityNamePascalized) %>>));
+ <%_ } else if ((relation.relationshipType === 'many-to-many' || relation.relationshipType === 'one-to-many') && relation.ownerSide === true ) { _%>
var <%= relation.otherEntityNameLowerCasedPlural %> = _fixture.CreateMany<<%= asModel(relation.otherEntityNamePascalized) %>>(10);
_<%= relation.otherEntityNameLowerCased %>Service.Setup(service => service.GetAll()).Returns(Task.FromResult(<%= relation.otherEntityNameLowerCasedPlural %>.ToList() as IList<<%= asModel(relation.otherEntityNamePascalized) %>>));
<%_ }
@@ -126,8 +142,8 @@ namespace <%= namespace %>.Client.Test.Pages.Entities.<%= entityClassName %>
var update<%= entityClassName %>Page = RenderComponent<<%= namespace %>.Client.Pages.Entities.<%= entityClassName %>.<%= entityClassName %>Update>(ComponentParameter.CreateParameter("Id", 0));
// Act
- var <%= entityVariableName %>form = update<%= entityClassName %>Page.Find("form");
- <%= entityVariableName %>form.Submit();
+ var <%= entityVariableName %>Form = update<%= entityClassName %>Page.Find("form");
+ <%= entityVariableName %>Form.Submit();
// Assert
_<%= entityVariableName %>Service.Verify(service => service.Add(It.IsAny<<%= asModel(entityClassName) %>>()), Times.Once);
diff --git a/generators/entity-server/templates/dotnetcore/src/Project.Domain.Services/Service.cs.ejs b/generators/entity-server/templates/dotnetcore/src/Project.Domain.Services/Service.cs.ejs
index 3fa6d9387..4c1320187 100644
--- a/generators/entity-server/templates/dotnetcore/src/Project.Domain.Services/Service.cs.ejs
+++ b/generators/entity-server/templates/dotnetcore/src/Project.Domain.Services/Service.cs.ejs
@@ -48,8 +48,10 @@ namespace <%= namespace %>.Domain.Services {
<%_ relationships.forEach( relationship => {
if (relationship.relationshipType === 'many-to-one' || relationship.relationshipType === 'one-to-one') { _%>
.Include(<%= camelCasedEntityClass %> => <%= camelCasedEntityClass %>.<%= relationship.relationshipFieldNamePascalized %>)
+ <%_ } else if (relationship.relationshipType === 'many-to-many' && relationship.ownerSide) { _%>
+ .Include(<%= camelCasedEntityClass %> => <%= camelCasedEntityClass %>.<%= relationship.relationshipFieldNamePascalizedPlural %>)
<%_ }
- }); _%>
+ }); _%>
.GetPageAsync(pageable);
return page;
}
diff --git a/generators/entity-server/templates/dotnetcore/src/Project.Domain/Entities/Entity.cs.ejs b/generators/entity-server/templates/dotnetcore/src/Project.Domain/Entities/Entity.cs.ejs
index bbcde4314..aca93ff14 100644
--- a/generators/entity-server/templates/dotnetcore/src/Project.Domain/Entities/Entity.cs.ejs
+++ b/generators/entity-server/templates/dotnetcore/src/Project.Domain/Entities/Entity.cs.ejs
@@ -61,7 +61,7 @@ namespace <%= namespace %>.Domain {
[Required]
<%_ } _%>
<%_ if (fields[idx].fieldIsEnum) { _%>
- public <%= fields[idx].fieldType %>? <%= fieldNamePascalized %> { get; set; }
+ public <%= fields[idx].fieldType %> <%= fieldNamePascalized %> { get; set; }
<%_ } else { _%>
public <%= fieldType %> <%= fieldNamePascalized %> { get; set; }
<%_ } _%>
diff --git a/generators/entity-server/templates/dotnetcore/src/Project.Dto/Dto.cs.ejs b/generators/entity-server/templates/dotnetcore/src/Project.Dto/Dto.cs.ejs
index 2f1d66cfc..e26b169aa 100644
--- a/generators/entity-server/templates/dotnetcore/src/Project.Dto/Dto.cs.ejs
+++ b/generators/entity-server/templates/dotnetcore/src/Project.Dto/Dto.cs.ejs
@@ -59,7 +59,7 @@ namespace <%= namespace %>.Dto {
[Required]
<%_ } _%>
<%_ if (fields[idx].fieldIsEnum) { _%>
- public <%= fields[idx].fieldType %>? <%= fieldNamePascalized %> { get; set; }
+ public <%= fields[idx].fieldType %> <%= fieldNamePascalized %> { get; set; }
<%_ } else { _%>
public <%= fieldType %> <%= fieldNamePascalized %> { get; set; }
<%_ } _%>
diff --git a/generators/entity-server/templates/dotnetcore/src/Project.Infrastructure/Data/Repositories/EntityRepository.cs.ejs b/generators/entity-server/templates/dotnetcore/src/Project.Infrastructure/Data/Repositories/EntityRepository.cs.ejs
index 9bd24778f..f1bd9ed72 100644
--- a/generators/entity-server/templates/dotnetcore/src/Project.Infrastructure/Data/Repositories/EntityRepository.cs.ejs
+++ b/generators/entity-server/templates/dotnetcore/src/Project.Infrastructure/Data/Repositories/EntityRepository.cs.ejs
@@ -43,13 +43,13 @@ namespace <%= namespace %>.Infrastructure.Data.Repositories
<%= camelCasedEntityClass %>.User = null;
<%_ }
}); _%>
- if (<%= camelCasedEntityClass %>.Id != 0 && exists) {
- <%_ relationships.forEach( relationship => {
+ <%_ relationships.forEach( relationship => {
if (relationship.relationshipType === 'many-to-many' && relationship.ownerSide) { _%>
- await RemoveManyToManyRelationship("<%= relationship.joinEntityFieldNamePascalizedPlural %>", "<%= relationship.otherEntityRelationshipNamePascalizedPlural %>Id", "<%= relationship.relationshipFieldNamePascalizedPlural %>Id", <%= camelCasedEntityClass %>.Id, <%= camelCasedEntityClass %>.<%= relationship.relationshipFieldNamePascalizedPlural %>.Select(x => x.Id).ToList());
+ await RemoveManyToManyRelationship("<%= relationship.joinEntityFieldNamePascalizedPlural %>", "<%= relationship.otherEntityRelationshipNamePascalizedPlural %>Id", "<%= relationship.relationshipFieldNamePascalizedPlural %>Id", <%= camelCasedEntityClass %>.Id, <%= camelCasedEntityClass %>.<%= relationship.relationshipFieldNamePascalizedPlural %>.Select(x => x.Id).ToList());
<%_ }
- }); _%>
- Update(<%= camelCasedEntityClass %>);
+ }); _%>
+ _context.AddOrUpdateGraph(<%= camelCasedEntityClass %>);
+ if (<%= camelCasedEntityClass %>.Id != 0 && exists) {
<%_ let first = true;
let suffix = 0;
relationships.forEach( relationship => {
@@ -65,14 +65,7 @@ namespace <%= namespace %>.Infrastructure.Data.Repositories
<%_ }
}
}); _%>
- } else {
- <%_ if (relationships.length != 0) { _%>
- _context.AddGraph(<%= camelCasedEntityClass %>);
- <%_ } else { _%>
- Add(<%= camelCasedEntityClass %>);
- <%_ } _%>
- }
-
+ }
return <%= camelCasedEntityClass %>;
}
}
diff --git a/generators/entity-server/templates/dotnetcore/src/Project/Controllers/EntityController.cs.ejs b/generators/entity-server/templates/dotnetcore/src/Project/Controllers/EntityController.cs.ejs
index 769357220..8f9394a88 100644
--- a/generators/entity-server/templates/dotnetcore/src/Project/Controllers/EntityController.cs.ejs
+++ b/generators/entity-server/templates/dotnetcore/src/Project/Controllers/EntityController.cs.ejs
@@ -119,9 +119,6 @@ namespace <%= namespace %>.Controllers {
{
_log.LogDebug($"REST request to update <%= pascalizedEntityClass %> : {<%= hasDto ? asDto(camelCasedEntityClass) : camelCasedEntityClass %>}");
if (<%= hasDto ? asDto(camelCasedEntityClass) : camelCasedEntityClass %>.Id == 0) throw new BadRequestAlertException("Invalid Id", EntityName, "idnull");
-
- //TODO catch //DbUpdateConcurrencyException into problem
-
<%_ if (hasDto) { _%>
<%= pascalizedEntityClass %> <%= camelCasedEntityClass %> = _mapper.Map<<%= pascalizedEntityClass %>>(<%= asDto(camelCasedEntityClass) %>);
<%_ } _%>
@@ -146,6 +143,8 @@ namespace <%= namespace %>.Controllers {
<%_ relationships.forEach( relationship => {
if (relationship.relationshipType === 'many-to-one' || relationship.relationshipType === 'one-to-one') { _%>
.Include(<%= camelCasedEntityClass %> => <%= camelCasedEntityClass %>.<%= relationship.relationshipFieldNamePascalized %>)
+ <%_ } else if (relationship.relationshipType === 'many-to-many' && relationship.ownerSide) { _%>
+ .Include(<%= camelCasedEntityClass %> => <%= camelCasedEntityClass %>.<%= relationship.relationshipFieldNamePascalizedPlural %>)
<%_ }
}); _%>
.GetPageAsync(pageable);
diff --git a/generators/entity/index.js b/generators/entity/index.js
index 245b96f27..9861f26eb 100644
--- a/generators/entity/index.js
+++ b/generators/entity/index.js
@@ -111,6 +111,7 @@ module.exports = class extends EntityGenerator {
if (field.fieldIsEnum === true) {
context.i18nToLoad.push(field.enumInstance);
+ field.enumValues = field.fieldValues.split(',').map(fieldValue => fieldValue.trim());
}
});
@@ -119,6 +120,7 @@ module.exports = class extends EntityGenerator {
relationship.relationshipNamePascalized = toPascalCase(relationship.relationshipName);
relationship.relationshipNamePascalizedPlural = pluralize(relationship.relationshipNamePascalized);
relationship.relationshipFieldNamePascalized = toPascalCase(relationship.relationshipFieldName);
+ relationship.relationshipFieldNameLowerCased = _.toLower(relationship.relationshipFieldName);
relationship.relationshipFieldNamePascalizedPlural = pluralize(relationship.relationshipFieldNamePascalized);
relationship.otherEntityNamePascalized = toPascalCase(relationship.otherEntityName);
relationship.otherEntityNamePascalizedPlural = toPascalCase(relationship.otherEntityNamePlural);
diff --git a/generators/server/files.js b/generators/server/files.js
index 57131b726..1de1c130f 100644
--- a/generators/server/files.js
+++ b/generators/server/files.js
@@ -375,11 +375,6 @@ const serverFiles = {
{
path: SERVER_SRC_DIR,
templates: [
- {
- file: 'Project.Infrastructure/Data/Extensions/DbContextExtensions.cs',
- renameTo: generator =>
- `${generator.pascalizedBaseName}${PROJECT_INFRASTRUCTURE_SUFFIX}/Data/Extensions/DbContextExtensions.cs`,
- },
{
file: 'Project.Infrastructure/Data/Extensions/DbSetExtensions.cs',
renameTo: generator =>
diff --git a/generators/server/templates/dotnetcore/src/Project.Crosscutting/Constants/Constants.cs.ejs b/generators/server/templates/dotnetcore/src/Project.Crosscutting/Constants/Constants.cs.ejs
index 3a4cf1887..fa2398d79 100644
--- a/generators/server/templates/dotnetcore/src/Project.Crosscutting/Constants/Constants.cs.ejs
+++ b/generators/server/templates/dotnetcore/src/Project.Crosscutting/Constants/Constants.cs.ejs
@@ -13,7 +13,6 @@
limitations under the License.
-%>
namespace <%= namespace %>.Crosscutting.Constants {
-//TODO Use Constants
public static class Constants {
// Regex for acceptable logins
public const string LoginRegex = "^[_.@A-Za-z0-9-]*$";
diff --git a/generators/server/templates/dotnetcore/src/Project.Domain/Repositories/Interfaces/IUnitOfWork.cs.ejs b/generators/server/templates/dotnetcore/src/Project.Domain/Repositories/Interfaces/IUnitOfWork.cs.ejs
index c2ca29e38..ad3d25479 100644
--- a/generators/server/templates/dotnetcore/src/Project.Domain/Repositories/Interfaces/IUnitOfWork.cs.ejs
+++ b/generators/server/templates/dotnetcore/src/Project.Domain/Repositories/Interfaces/IUnitOfWork.cs.ejs
@@ -28,7 +28,7 @@ namespace <%= namespace %>.Domain.Repositories.Interfaces
{
DbSet Set(string name = null) where T : class;
Task SaveChangesAsync(CancellationToken cancellationToken = default(CancellationToken));
- void AddGraph(TEntiy entity) where TEntiy : class;
+ void AddOrUpdateGraph(TEntiy entity) where TEntiy : class;
void UpdateState(TEntity entity, EntityState state);
void SetEntityStateModified(TEntiy entity, Expression> propertyExpression) where TEntiy : class where TProperty : class;
void RemoveNavigationProperty(TOwnerEntity ownerEntity, object id) where TEntity : class where TOwnerEntity : class;
diff --git a/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Extensions/DbContextExtensions.cs.ejs b/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Extensions/DbContextExtensions.cs.ejs
deleted file mode 100644
index 0fdfbc043..000000000
--- a/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Extensions/DbContextExtensions.cs.ejs
+++ /dev/null
@@ -1,31 +0,0 @@
-<%#
- Copyright 2013-2020 the original author or authors from the JHipster project.
- This file is part of the JHipster project, see https://www.jhipster.tech/
- for more information.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--%>
-using Microsoft.EntityFrameworkCore;
-
-namespace <%= namespace %>.Infrastructure.Data.Extensions {
- public static class DbContextExtensions {
- public static void AddGraph(this DbContext dbContext, object rootObject)
- {
- dbContext.ChangeTracker.TrackGraph(rootObject, e => {
- if (e.Entry.IsKeySet) {
- e.Entry.State = EntityState.Unchanged;
- }
- else {
- e.Entry.State = EntityState.Added;
- }
- });
- }
- }
-}
diff --git a/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Extensions/DbSetExtensions.cs.ejs b/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Extensions/DbSetExtensions.cs.ejs
index f11eb1342..e624adc15 100644
--- a/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Extensions/DbSetExtensions.cs.ejs
+++ b/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Extensions/DbSetExtensions.cs.ejs
@@ -44,9 +44,7 @@ namespace <%= namespace %>.Infrastructure.Data.Extensions {
p.CustomAttributes.Any(attr => attr.AttributeType == typeof(KeyAttribute)));
if (key != null) return key;
-
- //https://stackoverflow.com/questions/25141955/entityframework-6-how-to-get-identity-field-with-reflection
- //TODO complete with FluentAPi
+
return null;
}
diff --git a/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Repositories/UnitOfWork.cs.ejs b/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Repositories/UnitOfWork.cs.ejs
index 7cab574e4..98474bc69 100644
--- a/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Repositories/UnitOfWork.cs.ejs
+++ b/generators/server/templates/dotnetcore/src/Project.Infrastructure/Data/Repositories/UnitOfWork.cs.ejs
@@ -17,6 +17,7 @@
limitations under the License.
-%>
using System;
+using System.Linq;
using System.Linq.Expressions;
using System.Threading;
using System.Threading.Tasks;
@@ -51,6 +52,7 @@ namespace <%= namespace %>.Infrastructure.Data.Repositories
{
_context.Set().RemoveNavigationProperty(ownerEntity, id);
}
+
public async Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
using var saveChangeTask = _context.SaveChangesAsync(cancellationToken);
@@ -62,11 +64,16 @@ namespace <%= namespace %>.Infrastructure.Data.Repositories
return _context.Set(name);
}
- public void AddGraph(TEntiy entity) where TEntiy : class
+ public void AddOrUpdateGraph(TEntiy entity) where TEntiy : class
{
_context.ChangeTracker.TrackGraph(entity, e => {
+ var alreadyTrackedEntity = _context.ChangeTracker.Entries().FirstOrDefault(entry => entry.Entity.Equals(e.Entry.Entity));
+ if (alreadyTrackedEntity != null)
+ {
+ return;
+ }
if (e.Entry.IsKeySet) {
- e.Entry.State = EntityState.Unchanged;
+ e.Entry.State = EntityState.Modified;
}
else {
e.Entry.State = EntityState.Added;
diff --git a/generators/server/templates/dotnetcore/src/Project/Configuration/MvcStartup.cs.ejs b/generators/server/templates/dotnetcore/src/Project/Configuration/MvcStartup.cs.ejs
index e13645618..c2976ec63 100644
--- a/generators/server/templates/dotnetcore/src/Project/Configuration/MvcStartup.cs.ejs
+++ b/generators/server/templates/dotnetcore/src/Project/Configuration/MvcStartup.cs.ejs
@@ -34,7 +34,6 @@ namespace <%= namespace %>.Configuration {
//https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/health-checks?view=aspnetcore-2.2
services.AddHealthChecks();
- //TODO use AddMvcCore + config
services.AddControllers(options => { options.ModelBinderProviders.Insert(0, new PageableBinderProvider()); })
.AddNewtonsoftJson(options => {
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
diff --git a/generators/server/templates/dotnetcore/src/Project/Configuration/ProblemDetailsStartup.cs.ejs b/generators/server/templates/dotnetcore/src/Project/Configuration/ProblemDetailsStartup.cs.ejs
index f684565ff..1c4c77d20 100644
--- a/generators/server/templates/dotnetcore/src/Project/Configuration/ProblemDetailsStartup.cs.ejs
+++ b/generators/server/templates/dotnetcore/src/Project/Configuration/ProblemDetailsStartup.cs.ejs
@@ -30,7 +30,7 @@ namespace <%= namespace %>.Configuration {
{
services.AddProblemDetails(setup =>
{
- setup.IncludeExceptionDetails = (_context, _exception) => !environment.IsDevelopment();
+ setup.IncludeExceptionDetails = (_context, _exception) => environment.IsDevelopment();
// Map BadRequestAlertException and inheriting exceptions to ProblemDetails
setup.Map(exception => new ProblemDetails
diff --git a/generators/server/templates/dotnetcore/src/Project/Program.cs.ejs b/generators/server/templates/dotnetcore/src/Project/Program.cs.ejs
index 223ccfa62..6a5a86ab2 100644
--- a/generators/server/templates/dotnetcore/src/Project/Program.cs.ejs
+++ b/generators/server/templates/dotnetcore/src/Project/Program.cs.ejs
@@ -92,7 +92,9 @@ namespace <%= namespace %> {
})
<%_ } _%>
.UseStartup()
+ <%_ if(!skipClient && clientFramework != "Blazor") { _%>
.UseWebRoot(Path.Combine(Directory.GetCurrentDirectory(), "ClientApp", "dist"))
+ <%_ } _%>
.UseSerilog();
}
diff --git a/test-integration/scripts/01-init-env.sh b/test-integration/scripts/01-init-env.sh
index a56ee7d5f..9df623b14 100755
--- a/test-integration/scripts/01-init-env.sh
+++ b/test-integration/scripts/01-init-env.sh
@@ -6,10 +6,10 @@ else
APP_FOLDER=$1
fi
-if [[ $3 == "" ]]; then
+if [[ $4 == "" ]]; then
DEST_FOLDER=$HOME
else
- DEST_FOLDER=$3
+ DEST_FOLDER=$4
fi
if [[ $GITHUB_WORKSPACE == "" ]]; then
@@ -19,7 +19,11 @@ else
fi
if [[ "$APP_FOLDER" = "jwt-with-angular-app" && "$GITHUB_REPOSITORY" = "jhipster/jhipster-dotnetcore" && "$GITHUB_REF" = "refs/heads/main" ]]; then
- SONAR_ANALYSE=true
+ SONAR_ANALYSE_ANGULAR=true
+fi
+
+if [[ "$APP_FOLDER" = "jwt-with-blazor-app" && "$GITHUB_REPOSITORY" = "jhipster/jhipster-dotnetcore" && "$GITHUB_REF" = "refs/heads/main" ]]; then
+ SONAR_ANALYSE_ANGULAR=true
fi
#-------------------------------------------------------------------------------
diff --git a/test-integration/scripts/04-generate-entities-sample.sh b/test-integration/scripts/04-generate-entities-sample.sh
index fc9c32116..c6590d861 100755
--- a/test-integration/scripts/04-generate-entities-sample.sh
+++ b/test-integration/scripts/04-generate-entities-sample.sh
@@ -25,10 +25,14 @@ if [ "$2" = "import-jdl" ]; then
fi
if [[ -n $(find src -type f -name "*Employee.cs") ]]; then
- if "$SONAR_ANALYSE" ; then
+ if "$SONAR_ANALYSE_ANGULAR" ; then
dotnet tool install --global dotnet-sonarscanner
dotnet tool install --global coverlet.console
dotnet sonarscanner begin /k:"jhipster_jhipster-sample-app-dotnetcore" /o:"jhipster" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.login=$SONAR_TOKEN /s:"`pwd`/SonarQube.Analysis.xml"
+ elif "$SONAR_ANALYSE_BLAZOR" ; then
+ dotnet tool install --global dotnet-sonarscanner
+ dotnet tool install --global coverlet.console
+ dotnet sonarscanner begin /k:"jhipster_jhipster_sample-app-blazor" /o:"jhipster" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.login=$SONAR_TOKEN /s:"`pwd`/SonarQube.Analysis.xml"
fi
dotnet build
echo "${GREEN}GENERATION OK"
diff --git a/test-integration/scripts/05-run-generated-client-tests-of-sample.sh b/test-integration/scripts/05-run-generated-client-tests-of-sample.sh
index 789480683..62204c023 100755
--- a/test-integration/scripts/05-run-generated-client-tests-of-sample.sh
+++ b/test-integration/scripts/05-run-generated-client-tests-of-sample.sh
@@ -9,7 +9,7 @@ source $(dirname $0)/01-init-env.sh
#-------------------------------------------------------------------------------
# Change in template directory
#-------------------------------------------------------------------------------
-if [ "$2" = "blazor" ]; then
+if [ "$3" = "blazor" ]; then
cd test/JhipsterSampleApplication.Client.Test
else
cd src/JhipsterSampleApplication/ClientApp
@@ -21,7 +21,7 @@ echo "*** changed directory in : `pwd`"
# Run unit test
#-------------------------------------------------------------------------------
echo "*** run unit test in client for : `pwd`"
-if [ "$2" = "blazor" ]; then
+if [ "$3" = "blazor" ]; then
dotnet test
else
if [ -f "src/app/app.tsx" ]; then