Пользовательский тип сохранить только десятичное свойство - PullRequest
0 голосов
/ 16 мая 2018

Мы находимся на Entity Framework Core 2.0

Я хочу иметь модель, которая использует тип Money для одного из своих полей и использует вспомогательное поле десятичного типа.

Цель состоит в том, чтобы получить резервное поле, хранящееся в БД.

public class Order
    {
        private decimal _orderValue;

        public int Id { get; set; }

        public Money OrderValue
        {
            get => new Money(_orderValue);
            set => _orderValue = value.Amount;
        }
    }

Таким образом, класс Money не является сущностью, а используется как тип. Поэтому нам вообще не нужны деньги, чтобы быть в БД. Однако мы хотим сохранить десятичное значение. Как я могу убедиться, что EF создает и хранит приватное поле _orderValue?

1 Ответ

0 голосов
/ 16 мая 2018

Как мне убедиться, что EF создает и хранит приватное поле _orderValue?

Вы можете избавиться от поля поддержки, лучше используя EF Core 2.1 (который находится в Release Candidate 1 с 7 мая 2018 г.) можно использовать функцию преобразования значений, объясненную Microsoft здесь :

Преобразователи значений позволяют преобразовывать значения свойств, когдачтение или запись в базу данных.Это преобразование может быть из одного значения в другое того же типа (например, шифрование строк) или из значения одного типа в значение другого типа (например, преобразование значений перечисления в и из строк в базе данных.)

Так что для вашего случая вы можете просто удалить вспомогательное поле.Вам это больше не нужно.Ваш класс должен выглядеть следующим образом:

public class Order
{
    public int Id { get; set; }

    public Money OrderValue { get; set; }
}

И в вашем методе OnModelCreating вы настраиваете преобразование, как показано ниже:

modelBuilder.Entity<Order>()
    .Property(p => p.OrderValue)
    .HasConversion(
        v => v.Amount, // <- This is used when storing to the DB
        v => new Money(v) // <- this is used when reading data from your DB
    );

Вот и все.На самом деле, это версия кандидата, но Microsoft говорит:

EF Core 2.1 RC1 - это версия, готовая к работе, что означает, что как только вы проверите, что ваше приложение работает правильно с RC1, вы можете использовать его в работеи получить поддержку от Microsoft, но вы все равно должны обновить ее до окончательного стабильного выпуска, как только он станет доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...