Не стоит ставить лог c в модели EF. Модели EF просто используются для сопоставления объектов с таблицами базы данных. в виде расчетов (например, GrossProfit). GrossProfit можно рассчитывать на лету, а не сохранять в базе данных. Все бизнес-логики c должны выполняться в объектах передачи данных (DTO). Создайте еще один набор моделей (DTO), который будет использоваться для преобразования данных на основе бизнес-правил. Это модели, которые вы можете вернуть клиенту:
public class SalesProjectionDTO
{
public int Id { get; set; }
public string Name { get; set; }
public decimal SalesAmount { get; set; }
public decimal CostofSales { get; set; }
public decimal GrossProfit { get; set; }
}
Затем, если вы используете Entity Framework:
public List<SalesProjectionDTO> GetProjectionsByDateRange(int startMonth, int endMonth)
{
var projections = _context.SalesProjection
.Where(sp => sp.SalesProjectionMonths
.Any(m => m.Month >= startMonth && m.Month <= endMonth))
.Select(sp => new SalesProjectionDTO {
Name = sp.Name,
SalesAmount = sp.SalesAmount,
CostOfSales = sp.CostOfSales,
GrossProfit = sp.SalesAmount - sp.CostOfSales
}).ToList();
return projections;
}
public void SaveProjections(SalesProjectionDTO projection, int startMonth, int endMonth)
{
//check if projection exists
var entity= _context.SalesProjection.Where(sp => sp.Id == projection.Id)
.FirstOrDefault() ?? new SalesProjection();
if (entity== null)
_context.Add(projection);
entity.Name = projection.Name;
entity.SalesAmount = projection.SalesAmount;
entity.CostOfSales = projection.CostOfSames;
for (var i = startMonth; i <= endMonth; i++){
entity.ProjectionMonths.Add(
new ProjectionMonth {
Month = i;
}
}
_context.SaveChanges();
}