Как преобразовать свойства EF в вычисляемые столбцы SQL Server? - PullRequest
3 голосов
/ 13 февраля 2012

Я хотел бы преобразовать свойства этих Entity Framework в вычисляемые столбцы SQL Server. Является ли это возможным? Все остальные указанные свойства являются полями таблицы. Более того, учитывая, что я использую Code First, как мне указать вычисляемые столбцы внутри моей модели?

public enum Severity : int { INTIME = 0, B = 1, M = 2, A = 3, TIMEOUT = 4 };
public enum StatiTT : int { ND_INT = 1, ND_REP = 2, INT = 3, DI = 4, CH = 5, RV = 6, AN = 7 };
private const float TRESH_B = (float)0.5;
private const float TRESH_M = (float)0.3;
private const float TRESH_A = (float)0.2;

A)

 public int MinutiAllaScadenza
   {
       get
       {
           int mm = 0;
           DateTime Ora = DateTime.Now;

           mm = (DataObiettivo - Ora).Days*1440 + (DataObiettivo - Ora).Hours * 60 + (DataObiettivo - Ora).Minutes;

           if (StatoTicketID > (int)StatiTT.DI && mm < 0) mm = 10000000; 

           return mm;
       }
   }

В)

public int Sev 
   {
       get
       {
           int sev = 0; 
           float perctres = PercentualeTempoResiduo; 

           if (StatoTicketID < (int)StatiTT.CH)
           {
               if (MinutiAllaScadenza < 0) { sev = (int)Severity.TIMEOUT; return sev; }
               if (perctres < TRESH_A) { sev = (int)Severity.A; return sev; }
               if (perctres < TRESH_M) { sev = (int)Severity.M; return sev; }
               if (perctres < TRESH_B) { sev = (int)Severity.B; return sev; }
           }
           return sev;
       }
   }

С)

public float PercentualeTempoResiduo
   {
       get
       {

           if (StatoTicketID > (int)StatiTT.DI) return 999;

           float perc = 0;
           float mm2scad = (float)MinutiAllaScadenza;
           float mmtot = (float)TempoTotaleInizio_Obiettivo;

           if (MinutiAllaScadenza > 0)

               perc = (float)1 - (mmtot-mm2scad) / mmtot;

           return perc;
       }
   }

D)

   public string Alert
   {
       get
       {
           string alert = "";
           float perctres = PercentualeTempoResiduo; 

           if (StatoTicketID < (int)StatiTT.CH) {
               if (perctres < TRESH_A) { alert = "A"; return alert; }
               if (perctres < TRESH_M) { alert = "M"; return alert; }
               if (perctres < TRESH_B) { alert = "B"; return alert; }
           }
           return alert;
       }
   }

Большое спасибо!

1 Ответ

1 голос
/ 13 февраля 2012

Ответ на ваш главный вопрос - да, эти подпрограммы C # могут быть преобразованы в вычисляемые столбцы. Но есть одно условие: соответствующая информация, необходимая для вычисления результата, должна быть найдена в самой таблице.

Для вашего свойства Alert вот как будет выглядеть ваш вычисляемый столбец:

alter table <TBLNAME> add <COLNAME>  AS (
  case 
    when StatoTicketID < (int)StatiTT.CH AND perctres < .2 then 'A'
    when StatoTicketID < (int)StatiTT.CH AND perctres < .3 then 'M'
    when StatoTicketID < (int)StatiTT.CH AND perctres < .5 then 'B'
    else ''
  end)

Если вашему вычисленному результату нужно использовать информацию из других таблиц, рассмотрите возможность привязки EF к представлению для чтения, а затем используйте простые объекты EF для операций записи.

Что касается кода в первую очередь, вы не можете написать вычисляемый столбец в C # и ожидать, что EF переведет его в вычисляемый столбец SQLServer для вас. Запишите вычисляемый столбец в БД после того, как вы сначала сгенерировали модель, а затем вернитесь и подключите ее к объекту EF.

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