Browse Source

Merge pull request #5451 from abpframework/maliming/change-type-string-guid

Handle GUID & nullable type before Change Type.
pull/5538/head
Halil İbrahim Kalkan 5 years ago
committed by GitHub
parent
commit
5a56d91a42
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs
  2. 21
      framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/HasExtraPropertiesExtensions.cs
  3. 5
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/ExtraProperties_Tests.cs
  4. 7
      framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/TestEntityExtensionConfigurator.cs
  5. 3
      framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs
  6. 14
      framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/HasExtraPropertiesExtensions_Tests.cs

17
framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/EntityFrameworkCore/AbpDbContext.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations.Schema;
using System.Globalization;
using System.Linq;
@ -22,6 +23,7 @@ using Volo.Abp.EntityFrameworkCore.EntityHistory;
using Volo.Abp.EntityFrameworkCore.Modeling;
using Volo.Abp.EntityFrameworkCore.ValueConverters;
using Volo.Abp.Guids;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectExtending;
using Volo.Abp.Reflection;
@ -339,7 +341,20 @@ namespace Volo.Abp.EntityFrameworkCore
{
if (TypeHelper.IsPrimitiveExtended(entryProperty.Metadata.ClrType, includeEnums: true))
{
entryProperty.CurrentValue = Convert.ChangeType(entityProperty, entryProperty.Metadata.ClrType, CultureInfo.InvariantCulture);
var conversionType = entryProperty.Metadata.ClrType;
if (TypeHelper.IsNullable(conversionType))
{
conversionType = conversionType.GetFirstGenericArgumentIfNullable();
}
if (conversionType == typeof(Guid))
{
entryProperty.CurrentValue = TypeDescriptor.GetConverter(conversionType).ConvertFromInvariantString(entityProperty.ToString());
}
else
{
entryProperty.CurrentValue = Convert.ChangeType(entityProperty, conversionType, CultureInfo.InvariantCulture);
}
}
}
}

21
framework/src/Volo.Abp.ObjectExtending/Volo/Abp/Data/HasExtraPropertiesExtensions.cs

@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Localization;
using Volo.Abp.ObjectExtending;
using Volo.Abp.Reflection;
@ -32,15 +34,26 @@ namespace Volo.Abp.Data
if (TypeHelper.IsPrimitiveExtended(typeof(TProperty), includeEnums: true))
{
return (TProperty)Convert.ChangeType(value, typeof(TProperty), CultureInfo.InvariantCulture);
var conversionType = typeof(TProperty);
if (TypeHelper.IsNullable(conversionType))
{
conversionType = conversionType.GetFirstGenericArgumentIfNullable();
}
if (conversionType == typeof(Guid))
{
return (TProperty)TypeDescriptor.GetConverter(conversionType).ConvertFromInvariantString(value.ToString());
}
return (TProperty)Convert.ChangeType(value, conversionType, CultureInfo.InvariantCulture);
}
throw new AbpException("GetProperty<TProperty> does not support non-primitive types. Use non-generic GetProperty method and handle type casting manually.");
}
public static TSource SetProperty<TSource>(
this TSource source,
string name,
this TSource source,
string name,
object value,
bool validate = true)
where TSource : IHasExtraProperties
@ -96,4 +109,4 @@ namespace Volo.Abp.Data
((IHasExtraProperties) source).SetDefaultsForExtraProperties(objectType);
}
}
}
}

5
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/ExtraProperties_Tests.cs

@ -29,15 +29,18 @@ namespace Volo.Abp.EntityFrameworkCore.Domain
london.ExtraProperties["PhoneCode"] = 123456;
london.ExtraProperties["Rank"] = "88";
london.ExtraProperties["ZipCode"] = null;
london.ExtraProperties["Established"] = DateTime.MinValue;
london.ExtraProperties["Guid"] = "a7ae2efe-d8d6-466b-92e3-da14aa6e1c5b";
await CityRepository.UpdateAsync(london);
var london2 = await CityRepository.FindByNameAsync("London");
london2.GetProperty<string>("PhoneCode").ShouldBe("123456");
london2.GetProperty<int>("Rank").ShouldBe(88);
london2.GetProperty<string>("ZipCode").ShouldBe(null);
london2.GetProperty<DateTime?>("Established").ShouldBe(DateTime.MinValue);
london2.GetProperty<Guid>("Guid").ShouldBe(new Guid("a7ae2efe-d8d6-466b-92e3-da14aa6e1c5b"));
}
[Fact]
public async Task An_Extra_Property_Configured_As_Extension2()
{

7
framework/test/Volo.Abp.EntityFrameworkCore.Tests/Volo/Abp/EntityFrameworkCore/Domain/TestEntityExtensionConfigurator.cs

@ -1,4 +1,5 @@
using Volo.Abp.ObjectExtending;
using System;
using Volo.Abp.ObjectExtending;
using Volo.Abp.TestApp.Domain;
using Volo.Abp.Threading;
@ -24,6 +25,10 @@ namespace Volo.Abp.EntityFrameworkCore.Domain
"ZipCode"
).MapEfCoreProperty<City, int>(
"Rank"
).MapEfCoreProperty<City, DateTime?>(
"Established"
).MapEfCoreProperty<City, Guid>(
"Guid"
);
});
}

3
framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/TestDataBuilder.cs

@ -52,7 +52,8 @@ namespace Volo.Abp.TestApp
{
{ "Population", 10_470_000 },
{ "PhoneCode", "42" },
{ "ZipCode", "1000" }
{ "ZipCode", "1000" },
{ "Guid", "a5ed8170-30b9-4580-a395-a3c2dbc031ee" }
}
});
await _cityRepository.InsertAsync(istanbul);

14
framework/test/Volo.Abp.TestApp/Volo/Abp/TestApp/Testing/HasExtraPropertiesExtensions_Tests.cs

@ -32,6 +32,18 @@ namespace Volo.Abp.TestApp.Testing
city.HasProperty("IsHot").ShouldBeFalse();
city.GetProperty<bool>("IsHot").ShouldBeFalse();
city.GetProperty<bool>("IsHot", true).ShouldBeTrue();
city.GetProperty<bool?>("IsHot?").ShouldBeNull();
city.GetProperty<bool?>("IsHot?", true).Value.ShouldBeTrue();
city.SetProperty("Guid", "2260AFEC-BBFD-42D4-A91A-DCB11E09B17F");
city.GetProperty<Guid>("Guid").ShouldBe(new Guid("2260AFEC-BBFD-42D4-A91A-DCB11E09B17F"));
city.SetProperty("Guid?", "2260AFEC-BBFD-42D4-A91A-DCB11E09B17F");
city.GetProperty<Guid?>("Guid?").ShouldBe(new Guid("2260AFEC-BBFD-42D4-A91A-DCB11E09B17F"));
city.SetProperty("DateTime?", DateTime.MinValue);
city.GetProperty<DateTime?>("DateTime?").ShouldBe(DateTime.MinValue);
}
}
}
}

Loading…
Cancel
Save