Конвертер единиц измерения C # Entity Framework NotMapped

#c# #entity-framework #entity-framework-core

#c# #entity-framework #entity-framework-core

Вопрос:

Я использую Entity Framework с базой данных SQL-Lite для сохранения своих значений. У меня есть много моделей, где мне нужно использовать единицы измерения. Каждый раз, когда изменяется единица измерения из значения, значение преобразуется. Я не хочу записывать каждое преобразование в установщик каждой единицы измерения.

Мой образец модели

 public double? DiameterD { get; set; }

[NotMapped]
public static UnitsNet.Units.LengthUnit DiameterDBaseUnit { get => UnitsNet.Units.LengthUnit.Millimeter; }

[NotMapped]
private LengthUnit? _DiameterDUnit;

[NotMapped]
public UnitsNet.Units.LengthUnit? DiameterDUnit
{
   get => this._DiameterDUnit ?? DiameterDBaseUnit;
   set
   {
       double convertedValue;

       UnitsNet.UnitConverter.TryConvert(
            this.DiameterD.Value,
            this._DiameterDUnit,
            value,
            out double convertedValue);

       this.DiameterD = convertedValue;
       this._DiameterDUnit = value;
   }
}
  

итак, на самом деле я хочу иметь что-то вроде этого;

Класс UnitValue

 public double? Value {get; set;}

public System.Enum? BaseUnit { get; set; }

private System.Enum? _Unit {get; set; }

public System.Enum? Unit  
{
   get => this._Unit ?? BaseUnit;
   set
   {
       double convertedValue;

       UnitsNet.UnitConverter.TryConvert(
            this.Value.Value,
            this._Unit,
            value,
            out double convertedValue);

       this.DiameterD = convertedValue;
       this._DiameterDUnit = value;
  }
  

и в моей базе данных-модели;

 public static UnitValue.Value DiameterD {get; set;}

[NotMapped]
public static UnitValue.BaseUnit { get => UnitsNet.Units.LengthUnit.Millimeter; }

[NotMapped]
public static UnitValue.Unit { get; set;} 
  

Может быть, есть несколько лучших практик, чтобы реализовать это. Я также не хочу создавать новую таблицу в своей базе данных.

Ответ №1:

Вы могли бы использовать преобразование значений EF Core.

 // in your DbContext class
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<SampleModel>()
        .Property(x => x.DiameterD)
        .HasConversion(
            v => v.As(LengthUnit.Millimeter),
            v => new Length(v, LengthUnit.Millimeter));
}
  

Я создал библиотеку, чтобы помочь с этим:https://github.com/gojanpaolo/UnitsNet.EntityFrameworkCore
Затем вы могли бы реорганизовать свой код следующим образом:

 protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<SampleModel>(builder =>
    {
        builder.Property(x => x.DiameterD).HasConversion(LengthUnit.Millimeter);
        builder.Property(x => x.SpeedS).HasConversion(SpeedUnit.KilometerPerHour);
    });
}