#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);
});
}