diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln
index 65cac6e7cd..6957eb2baf 100644
--- a/framework/Volo.Abp.sln
+++ b/framework/Volo.Abp.sln
@@ -355,6 +355,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.AspNetCore.Compone
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Swashbuckle", "src\Volo.Abp.Swashbuckle\Volo.Abp.Swashbuckle.csproj", "{DD9519E0-5A68-48DC-A051-7BF2AC922F3E}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Json.Tests", "test\Volo.Abp.Json.Tests\Volo.Abp.Json.Tests.csproj", "{00D07595-993C-40FC-BD90-0DD6331414D3}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -1057,6 +1059,10 @@ Global
{DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {00D07595-993C-40FC-BD90-0DD6331414D3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {00D07595-993C-40FC-BD90-0DD6331414D3}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1236,6 +1242,7 @@ Global
{B9D1ADCB-D552-4626-A1F1-78FF72C1E822} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{89840441-5A3A-4FD7-9CB4-E5B52FAEF72A} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
{DD9519E0-5A68-48DC-A051-7BF2AC922F3E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6}
+ {00D07595-993C-40FC-BD90-0DD6331414D3} = {447C8A77-E5F0-4538-8687-7383196D04EA}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj
index 3e691f57f3..a018dbbffd 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo.Abp.AspNetCore.Mvc.csproj
@@ -28,8 +28,8 @@
-
+
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
index 715ec0a0ce..61d73cb48b 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/AbpAspNetCoreMvcModule.cs
@@ -35,6 +35,7 @@ using Volo.Abp.Http;
using Volo.Abp.DynamicProxy;
using Volo.Abp.GlobalFeatures;
using Volo.Abp.Http.Modeling;
+using Volo.Abp.Json;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.UI;
@@ -115,11 +116,6 @@ namespace Volo.Abp.AspNetCore.Mvc
);
var mvcBuilder = context.Services.AddMvc()
- .AddNewtonsoftJson(options =>
- {
- options.SerializerSettings.ContractResolver =
- new AbpMvcJsonContractResolver(context.Services);
- })
.AddRazorRuntimeCompilation()
.AddDataAnnotationsLocalization(options =>
{
@@ -140,6 +136,8 @@ namespace Volo.Abp.AspNetCore.Mvc
})
.AddViewLocalization(); //TODO: How to configure from the application? Also, consider to move to a UI module since APIs does not care about it.
+ mvcCoreBuilder.AddAbpHybridJson();
+
Configure(options =>
{
options.FileProviders.Add(
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs
new file mode 100644
index 0000000000..bd2ade69ad
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonInputFormatter.cs
@@ -0,0 +1,39 @@
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc.Formatters;
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.Json.SystemTextJson;
+
+namespace Volo.Abp.AspNetCore.Mvc.Json
+{
+ public class AbpHybridJsonInputFormatter : TextInputFormatter, IInputFormatterExceptionPolicy
+ {
+ public AbpHybridJsonInputFormatter()
+ {
+ SupportedEncodings.Add(UTF8EncodingWithoutBOM);
+ SupportedEncodings.Add(UTF16EncodingLittleEndian);
+
+ SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationJson);
+ SupportedMediaTypes.Add(MediaTypeHeaderValues.TextJson);
+ SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationAnyJsonSyntax);
+ }
+
+ public async override Task ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
+ {
+ return await GetTextInputFormatter(context).ReadRequestBodyAsync(context, encoding);
+ }
+
+ protected virtual TextInputFormatter GetTextInputFormatter(InputFormatterContext context)
+ {
+ var typesMatcher = context.HttpContext.RequestServices.GetRequiredService();
+ if (!typesMatcher.Match(context.ModelType))
+ {
+ return context.HttpContext.RequestServices.GetRequiredService();
+ }
+
+ return context.HttpContext.RequestServices.GetRequiredService();
+ }
+
+ public virtual InputFormatterExceptionPolicy ExceptionPolicy => InputFormatterExceptionPolicy.MalformedInputExceptions;
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs
new file mode 100644
index 0000000000..1507457f08
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpHybridJsonOutputFormatter.cs
@@ -0,0 +1,37 @@
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc.Formatters;
+using Microsoft.Extensions.DependencyInjection;
+using Volo.Abp.Json.SystemTextJson;
+
+namespace Volo.Abp.AspNetCore.Mvc.Json
+{
+ public class AbpHybridJsonOutputFormatter : TextOutputFormatter
+ {
+ public AbpHybridJsonOutputFormatter()
+ {
+ SupportedEncodings.Add(Encoding.UTF8);
+ SupportedEncodings.Add(Encoding.Unicode);
+
+ SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationJson);
+ SupportedMediaTypes.Add(MediaTypeHeaderValues.TextJson);
+ SupportedMediaTypes.Add(MediaTypeHeaderValues.ApplicationAnyJsonSyntax);
+ }
+
+ public async override Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
+ {
+ await GetTextInputFormatter(context).WriteResponseBodyAsync(context, selectedEncoding);
+ }
+
+ protected virtual TextOutputFormatter GetTextInputFormatter(OutputFormatterWriteContext context)
+ {
+ var typesMatcher = context.HttpContext.RequestServices.GetRequiredService();
+ if (!typesMatcher.Match(context.ObjectType))
+ {
+ return context.HttpContext.RequestServices.GetRequiredService();
+ }
+
+ return context.HttpContext.RequestServices.GetRequiredService();
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs
new file mode 100644
index 0000000000..4b63828997
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpJsonOptionsSetup.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Text.Json;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using Volo.Abp.Json.SystemTextJson.JsonConverters;
+
+namespace Volo.Abp.AspNetCore.Mvc.Json
+{
+ public class AbpJsonOptionsSetup : IConfigureOptions
+ {
+ protected IServiceProvider ServiceProvider { get; }
+
+ public AbpJsonOptionsSetup(IServiceProvider serviceProvider)
+ {
+ ServiceProvider = serviceProvider;
+ }
+
+ public void Configure(JsonOptions options)
+ {
+ options.JsonSerializerOptions.ReadCommentHandling = JsonCommentHandling.Skip;
+ options.JsonSerializerOptions.AllowTrailingCommas = true;
+
+ options.JsonSerializerOptions.Converters.Add(ServiceProvider.GetRequiredService());
+ options.JsonSerializerOptions.Converters.Add(ServiceProvider.GetRequiredService());
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcJsonContractResolver.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcJsonContractResolver.cs
index 695212f563..2021afd492 100644
--- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcJsonContractResolver.cs
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcJsonContractResolver.cs
@@ -1,28 +1,32 @@
-using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Reflection;
+using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
-using System;
-using System.Reflection;
+using Volo.Abp.DependencyInjection;
using Volo.Abp.Json.Newtonsoft;
using Volo.Abp.Reflection;
using Volo.Abp.Timing;
namespace Volo.Abp.AspNetCore.Mvc.Json
{
- public class AbpMvcJsonContractResolver : DefaultContractResolver
+ public class AbpMvcJsonContractResolver : DefaultContractResolver, ITransientDependency
{
private readonly Lazy _dateTimeConverter;
- public AbpMvcJsonContractResolver(IServiceCollection services)
+ public AbpMvcJsonContractResolver(IServiceProvider serviceProvider)
{
- _dateTimeConverter = services.GetServiceLazy();
+ _dateTimeConverter = new Lazy(
+ serviceProvider.GetRequiredService,
+ true
+ );
NamingStrategy = new CamelCaseNamingStrategy();
}
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
- JsonProperty property = base.CreateProperty(member, memberSerialization);
+ var property = base.CreateProperty(member, memberSerialization);
ModifyProperty(member, property);
@@ -40,7 +44,6 @@ namespace Volo.Abp.AspNetCore.Mvc.Json
{
property.Converter = _dateTimeConverter.Value;
}
-
}
}
}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcNewtonsoftJsonOptionsSetup.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcNewtonsoftJsonOptionsSetup.cs
new file mode 100644
index 0000000000..48a09e2426
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/AbpMvcNewtonsoftJsonOptionsSetup.cs
@@ -0,0 +1,22 @@
+using System;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+
+namespace Volo.Abp.AspNetCore.Mvc.Json
+{
+ public class AbpMvcNewtonsoftJsonOptionsSetup : IConfigureOptions
+ {
+ protected IServiceProvider ServiceProvider { get; }
+
+ public AbpMvcNewtonsoftJsonOptionsSetup(IServiceProvider serviceProvider)
+ {
+ ServiceProvider = serviceProvider;
+ }
+
+ public void Configure(MvcNewtonsoftJsonOptions options)
+ {
+ options.SerializerSettings.ContractResolver = ServiceProvider.GetRequiredService();
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MediaTypeHeaderValues.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MediaTypeHeaderValues.cs
new file mode 100644
index 0000000000..d1f1b34b1a
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MediaTypeHeaderValues.cs
@@ -0,0 +1,22 @@
+using Microsoft.Net.Http.Headers;
+
+namespace Volo.Abp.AspNetCore.Mvc.Json
+{
+ ///
+ /// https://github.com/dotnet/aspnetcore/blob/master/src/Mvc/Mvc.NewtonsoftJson/src/MediaTypeHeaderValues.cs
+ ///
+ internal static class MediaTypeHeaderValues
+ {
+ public static readonly MediaTypeHeaderValue ApplicationJson = MediaTypeHeaderValue.Parse("application/json").CopyAsReadOnly();
+
+ public static readonly MediaTypeHeaderValue TextJson = MediaTypeHeaderValue.Parse("text/json").CopyAsReadOnly();
+
+ public static readonly MediaTypeHeaderValue ApplicationAnyJsonSyntax = MediaTypeHeaderValue.Parse("application/*+json").CopyAsReadOnly();
+
+ public static readonly MediaTypeHeaderValue ApplicationXml = MediaTypeHeaderValue.Parse("application/xml").CopyAsReadOnly();
+
+ public static readonly MediaTypeHeaderValue TextXml = MediaTypeHeaderValue.Parse("text/xml").CopyAsReadOnly();
+
+ public static readonly MediaTypeHeaderValue ApplicationAnyXmlSyntax = MediaTypeHeaderValue.Parse("application/*+xml").CopyAsReadOnly();
+ }
+}
diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs
new file mode 100644
index 0000000000..5a01cafb22
--- /dev/null
+++ b/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Json/MvcCoreBuilderExtensions.cs
@@ -0,0 +1,83 @@
+using System.Buffers;
+using System.Text.Json;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Formatters;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.Options;
+using System.Text.Encodings.Web;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.ObjectPool;
+
+namespace Volo.Abp.AspNetCore.Mvc.Json
+{
+ public static class MvcCoreBuilderExtensions
+ {
+ public static IMvcCoreBuilder AddAbpHybridJson(this IMvcCoreBuilder builder)
+ {
+ //SystemTextJsonInputFormatter
+ builder.Services.AddTransient(provider =>
+ {
+ var jsonOptions = provider.GetRequiredService>();
+ var logger = provider.GetRequiredService().CreateLogger();
+ return new SystemTextJsonInputFormatter(jsonOptions.Value, logger);
+ });
+
+ builder.Services.AddTransient();
+ //NewtonsoftJsonInputFormatter
+ builder.Services.AddTransient(provider =>
+ {
+ var jsonOptions = provider.GetRequiredService>().Value;
+
+ return new NewtonsoftJsonInputFormatter(
+ provider.GetRequiredService().CreateLogger(),
+ jsonOptions.SerializerSettings,
+ provider.GetRequiredService>(),
+ provider.GetRequiredService(),
+ provider.GetRequiredService>().Value,
+ jsonOptions);
+ });
+
+ //SystemTextJsonOutputFormatter
+ builder.Services.AddTransient(provider =>
+ {
+ var jsonSerializerOptions = provider.GetRequiredService>().Value.JsonSerializerOptions;
+ if (jsonSerializerOptions.Encoder is null)
+ {
+ // If the user hasn't explicitly configured the encoder, use the less strict encoder that does not encode all non-ASCII characters.
+ jsonSerializerOptions = new JsonSerializerOptions(jsonSerializerOptions)
+ {
+ Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
+ };
+ }
+ return new SystemTextJsonOutputFormatter(jsonSerializerOptions);
+ });
+
+ //NewtonsoftJsonOutputFormatter
+ builder.Services.AddTransient(provider =>
+ {
+ var jsonOptions = provider.GetRequiredService>().Value;
+ return new NewtonsoftJsonOutputFormatter(
+ jsonOptions.SerializerSettings,
+ provider.GetRequiredService>(),
+ provider.GetRequiredService>().Value);
+ });
+
+ builder.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpJsonOptionsSetup>());
+ builder.Services.TryAddEnumerable(ServiceDescriptor.Transient, AbpMvcNewtonsoftJsonOptionsSetup>());
+
+ builder.Services.Configure(options =>
+ {
+ options.InputFormatters.RemoveType();
+ options.InputFormatters.RemoveType();
+ options.InputFormatters.Add(new AbpHybridJsonInputFormatter());
+
+ options.OutputFormatters.RemoveType();
+ options.OutputFormatters.RemoveType();
+ options.OutputFormatters.Add(new AbpHybridJsonOutputFormatter());
+ });
+
+ return builder;
+ }
+ }
+}
diff --git a/framework/src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj b/framework/src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj
index 4ac2420c8f..2685236a89 100644
--- a/framework/src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj
+++ b/framework/src/Volo.Abp.Auditing/Volo.Abp.Auditing.csproj
@@ -23,4 +23,8 @@
+
+
+
+
diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs
index e6d03bf707..a88de55aea 100644
--- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs
+++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingContractResolver.cs
@@ -1,5 +1,6 @@
-using System;
+using System;
using System.Collections.Generic;
+using System.Linq;
using System.Reflection;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
@@ -19,18 +20,21 @@ namespace Volo.Abp.Auditing
{
var property = base.CreateProperty(member, memberSerialization);
- if (member.IsDefined(typeof(DisableAuditingAttribute)) || member.IsDefined(typeof(JsonIgnoreAttribute)))
+ if (_ignoredTypes.Any(ignoredType => ignoredType.GetTypeInfo().IsAssignableFrom(property.PropertyType)))
{
property.ShouldSerialize = instance => false;
+ return property;
}
- foreach (var ignoredType in _ignoredTypes)
+ if (member.DeclaringType != null && (member.DeclaringType.IsDefined(typeof(DisableAuditingAttribute)) || member.DeclaringType.IsDefined(typeof(JsonIgnoreAttribute))))
{
- if (ignoredType.GetTypeInfo().IsAssignableFrom(property.PropertyType))
- {
- property.ShouldSerialize = instance => false;
- break;
- }
+ property.ShouldSerialize = instance => false;
+ return property;
+ }
+
+ if (member.IsDefined(typeof(DisableAuditingAttribute)) || member.IsDefined(typeof(JsonIgnoreAttribute)))
+ {
+ property.ShouldSerialize = instance => false;
}
return property;
diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs
index b86df6b6c8..b1ce95675b 100644
--- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs
+++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/JsonNetAuditSerializer.cs
@@ -41,4 +41,4 @@ namespace Volo.Abp.Auditing
return _sharedJsonSerializerSettings;
}
}
-}
\ No newline at end of file
+}
diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs
index 65f2992257..b778ec2b67 100644
--- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs
+++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Entities/EntityHelper.cs
@@ -77,7 +77,7 @@ namespace Volo.Abp.Domain.Entities
{
var entity1Key = entity1Keys[i];
var entity2Key = entity2Keys[i];
-
+
if (entity1Key == null)
{
if (entity2Key == null)
@@ -89,13 +89,13 @@ namespace Volo.Abp.Domain.Entities
//entity2Key is not null!
return false;
}
-
+
if (entity2Key == null)
{
//entity1Key was not null!
return false;
}
-
+
if (TypeHelper.IsDefaultValue(entity1Key) && TypeHelper.IsDefaultValue(entity2Key))
{
return false;
@@ -266,5 +266,36 @@ namespace Volo.Abp.Domain.Entities
property?.SetValue(entity, idFactory());
}
+
+ public static void TrySetId(
+ object entity,
+ TKey id,
+ bool checkForDisableIdGenerationAttribute = false)
+ {
+ var property = CachedIdProperties.GetOrAdd(
+ $"{entity.GetType().FullName}-{checkForDisableIdGenerationAttribute}", () =>
+ {
+ var idProperty = entity
+ .GetType()
+ .GetProperties()
+ .FirstOrDefault(x => x.Name == nameof(IEntity