ASP. NET Ядро, добавляющее вычисления в мою модель свойств и имеющее столбец в базе данных. - PullRequest
1 голос
/ 26 марта 2020

В ASP. NET Ядро, у меня есть свойства, которые рассчитываются на основе других свойств, например, у меня есть

public class Worker
{
  public int Id {get;set;}
  public double Rev {get;set;}
  public double Cost {get;set;}
  public double Profit {get;set;}
}

, а Profit означает Rev - Cost и Некоторое время я работал над проблемой, когда в основном либо вычисления не выполнялись, либо столбец не существовал. В моем действии Create было бы что-то вроде этого

public async Task<IActionResult> Create([Bind("Id,Rev,Cost,Profit")] Worker worker)
{
    if (ModelState.IsValid)
    {
       Worker employee = new Worker
       {
          Rev = worker.Rev,
          Cost = worker.Cost,
          Profit = worker.Rev - worker.Cost
       };
       _context.Add(employee);
       await _context.SaveChangesAsync();
       return RedirectToAction(nameof(Index));
}

. При этом все будет отображаться в моей базе данных и будет выглядеть нормально, однако Profit не будет рассчитываться и будет равно 0. Если Я меняю свой контроллер и не вычисляю Profit в контроллере, а вместо этого вычисляю его в модели, все это работает так:

public class Worker{
    public int Id {get;set;}
    public double Rev {get;set;}
    public double Cost {get;set;}

    public double Profit{
       get
          {
             return Rev - Cost;
          }
    }
}

Все это работает, и вычисления выполняются, но Profit не является столбцом в моей Worker таблице. Мой вопрос заключается в том, как мне выполнить вычисления в модели, но при этом сохранить Profit как столбец в базе данных, мне нужно и get; set;, но я не уверен, как реализовать set при выполнении и сохранении расчеты?

Ответы [ 2 ]

1 голос
/ 26 марта 2020

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

public class Worker
{
    public int Id { get; set; }
    public double Rev { get; set; }
    public double Cost { get; set; }

    private double _profit;
    public double Profit
    {
        get
        {
            return Rev - Cost;
        }
        set
        {
            _profit = value;
        }
    }
}

Если вы используете EF Core версии 3.0+, вам нужно указать EF использовать вычисляемое свойство, а не основу. поле:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder
        .Entity<Worker>()
        .Property(e => e.Profit)
        .UsePropertyAccessMode(PropertyAccessMode.Property);
}

Источник: https://github.com/dotnet/efcore/issues/18998

1 голос
/ 26 марта 2020

Я могу предложить вам создать автоматически вычисляемый столбец в таблице базы данных, поэтому всякий раз, когда вы вставляете новое значение для столбцов Rev и Cost, столбец Profit будет автоматически вычисляться, например:

ALTER TABLE dbo.Worker
ADD Profit AS Rev-Cost;

Таким образом, вы сможете вставлять Rev и Cost значения в таблицу и не беспокоиться о вычислениях.
Позже вы просто прочитаете Profit значение в ваше свойство Model -> Profit, так же, как вы читаете другие свойства из таблицы SQL.

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