EFcoreExtension
All checks were successful
Publish NuGet packages / publish (push) Successful in 1m15s

This commit is contained in:
2026-06-13 20:25:29 +07:00
parent e3ab850ec2
commit 7c0f89ebbb
10 changed files with 1332 additions and 1169 deletions

View File

@@ -0,0 +1,20 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
namespace QWERTYkez.Mensura.Extensions;
public static partial class EFCoreExtension
{
/// <summary>
/// Регистрирует ValueConverter для всех типов, реализующих IMensuraUnit.
/// </summary>
public static void UseMensuraUnits(this ModelConfigurationBuilder configurationBuilder)
{
AddGeneratedConverters(configurationBuilder);
AddGeneratedComplexConverters(configurationBuilder);
}
internal class MensuraUnitConverter<U>()
: ValueConverter<U, double>(unit => unit.ToDouble(), value => value.ToUnit<U>())
where U : struct, IMensuraUnit, IEquatable<U> { }
}

View File

@@ -9,7 +9,7 @@ internal class ListMimic<T>
}
[StructLayout(LayoutKind.Explicit, Size = 16)]
public struct NullableDoubleMimic
internal struct NullableDoubleMimic
{
[FieldOffset(0)] public bool HasValue;
[FieldOffset(8)] public double Value;

View File

@@ -10,10 +10,18 @@
<NoWarn>1701;1702;IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\QWERTYkez.Mensura.Generator\QWERTYkez.Mensura.Generator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<InternalsVisibleTo Include="QWERTYkez.Mensura.Tests" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" PrivateAssets="All" />
<ProjectReference Include="..\QWERTYkez.Mensura.Generator\QWERTYkez.Mensura.Generator.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
<InternalsVisibleTo Include="QWERTYkez.Mensura.Tests" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.36" Condition="'$(TargetFramework)' == 'net6.0'" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.20" Condition="'$(TargetFramework)' == 'net7.0'" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.28" Condition="'$(TargetFramework)' == 'net8.0'" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.17" Condition="'$(TargetFramework)' == 'net9.0'" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="10.0.9" Condition="'$(TargetFramework)' == 'net10.0'" PrivateAssets="All" />
</ItemGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@@ -1,70 +1,70 @@
#if DEBUG
namespace QWERTYkez.Mensura.Units;
//#if DEBUG
//namespace QWERTYkez.Mensura.Units;
/// <summary>
/// Base value is MilliMeters
/// </summary>
[DebuggerDisplay("mm = {_MilliMeters.ToString(\"0.###\")}, m = {Meters.ToString(\"0.###\")}")]
public readonly partial record struct XXXXXXXX
{
public static XXXXXXXX MilliMeter { get; } = new(1);
[NotMapped, JsonIgnore, IgnoreDataMember] public double _MilliMeters { get => _Value; init => _Value = value; }
///// <summary>
///// Base value is MilliMeters
///// </summary>
//[DebuggerDisplay("mm = {_MilliMeters.ToString(\"0.###\")}, m = {Meters.ToString(\"0.###\")}")]
//public readonly partial record struct XXXXXXXX
//{
// public static XXXXXXXX MilliMeter { get; } = new(1);
// [NotMapped, JsonIgnore, IgnoreDataMember] public double _MilliMeters { get => _Value; init => _Value = value; }
public static XXXXXXXX CentiMeter { get; } = new(XXXXXXXXConv.CentiMeters.To(1));
[NotMapped, JsonIgnore, IgnoreDataMember]
public double CentiMeters
{
get => XXXXXXXXConv.CentiMeters.From(_Value);
init
{
_Value = XXXXXXXXConv.CentiMeters.To(value);
}
}
// public static XXXXXXXX CentiMeter { get; } = new(XXXXXXXXConv.CentiMeters.To(1));
// [NotMapped, JsonIgnore, IgnoreDataMember]
// public double CentiMeters
// {
// get => XXXXXXXXConv.CentiMeters.From(_Value);
// init
// {
// _Value = XXXXXXXXConv.CentiMeters.To(value);
// }
// }
public static XXXXXXXX DeciMeter { get; } = new(XXXXXXXXConv.DeciMeters.To(1));
[NotMapped, JsonIgnore, IgnoreDataMember]
public double DeciMeters
{
get => XXXXXXXXConv.DeciMeters.From(_Value);
init => _Value = XXXXXXXXConv.DeciMeters.To(value);
}
// public static XXXXXXXX DeciMeter { get; } = new(XXXXXXXXConv.DeciMeters.To(1));
// [NotMapped, JsonIgnore, IgnoreDataMember]
// public double DeciMeters
// {
// get => XXXXXXXXConv.DeciMeters.From(_Value);
// init => _Value = XXXXXXXXConv.DeciMeters.To(value);
// }
public static XXXXXXXX Meter { get; } = new(XXXXXXXXConv.Meters.To(1));
[NotMapped, JsonIgnore, IgnoreDataMember]
public double Meters
{
get => XXXXXXXXConv.Meters.From(_Value);
init => _Value = XXXXXXXXConv.Meters.To(value);
}
// public static XXXXXXXX Meter { get; } = new(XXXXXXXXConv.Meters.To(1));
// [NotMapped, JsonIgnore, IgnoreDataMember]
// public double Meters
// {
// get => XXXXXXXXConv.Meters.From(_Value);
// init => _Value = XXXXXXXXConv.Meters.To(value);
// }
public static XXXXXXXX KiloMeter { get; } = new(XXXXXXXXConv.KiloMeters.To(1));
[NotMapped, JsonIgnore, IgnoreDataMember]
public double KiloMeters
{
get => XXXXXXXXConv.KiloMeters.From(_Value);
init => _Value = XXXXXXXXConv.KiloMeters.To(value);
}
// public static XXXXXXXX KiloMeter { get; } = new(XXXXXXXXConv.KiloMeters.To(1));
// [NotMapped, JsonIgnore, IgnoreDataMember]
// public double KiloMeters
// {
// get => XXXXXXXXConv.KiloMeters.From(_Value);
// init => _Value = XXXXXXXXConv.KiloMeters.To(value);
// }
public XXXXXXXX AddMilliMeters(double value) => new(_Value + value);
public XXXXXXXX AddCentiMeters(double value) => new(_Value + XXXXXXXXConv.CentiMeters.To(value));
public XXXXXXXX AddDeciMeters(double value) => new(_Value + XXXXXXXXConv.DeciMeters.To(value));
public XXXXXXXX AddMeters(double value) => new(_Value + XXXXXXXXConv.Meters.To(value));
public XXXXXXXX AddKiloMeters(double value) => new(_Value + XXXXXXXXConv.KiloMeters.To(value));
}
// public XXXXXXXX AddMilliMeters(double value) => new(_Value + value);
// public XXXXXXXX AddCentiMeters(double value) => new(_Value + XXXXXXXXConv.CentiMeters.To(value));
// public XXXXXXXX AddDeciMeters(double value) => new(_Value + XXXXXXXXConv.DeciMeters.To(value));
// public XXXXXXXX AddMeters(double value) => new(_Value + XXXXXXXXConv.Meters.To(value));
// public XXXXXXXX AddKiloMeters(double value) => new(_Value + XXXXXXXXConv.KiloMeters.To(value));
//}
internal readonly struct XXXXXXXXConv
{
private XXXXXXXXConv(double multiplicator) => this.Multiplicator = multiplicator;
public double To(double value) => value * Multiplicator;
public double From(double value) => value / Multiplicator;
public double Multiplicator { get; init; }
public static XXXXXXXXConv MilliMeters { get; } = new(1);
public static XXXXXXXXConv CentiMeters { get; } = new(10);
public static XXXXXXXXConv DeciMeters { get; } = new(100);
public static XXXXXXXXConv Meters { get; } = new(1000);
public static XXXXXXXXConv KiloMeters { get; } = new(1000000);
}
#endif
//internal readonly struct XXXXXXXXConv
//{
// private XXXXXXXXConv(double multiplicator) => this.Multiplicator = multiplicator;
// public double To(double value) => value * Multiplicator;
// public double From(double value) => value / Multiplicator;
// public double Multiplicator { get; init; }
// public static XXXXXXXXConv MilliMeters { get; } = new(1);
// public static XXXXXXXXConv CentiMeters { get; } = new(10);
// public static XXXXXXXXConv DeciMeters { get; } = new(100);
// public static XXXXXXXXConv Meters { get; } = new(1000);
// public static XXXXXXXXConv KiloMeters { get; } = new(1000000);
//}
//#endif