2011-12-14 12 views

risposta

33

Come per la mia previous question su come conservare TimeSpan in SQL mi hanno consigliato di conservarlo come secondi o biglietti ecc. Alla fine non ho mappato la colonna TimeSpan in quanto non esiste un equivalente nel server SQL. Ho semplicemente creato un secondo campo che ha convertito TimeSpan in tick e memorizzato nel DB. Ho poi impedito memorizzare il TimeSpan

public Int64 ValidityPeriodTicks { get; set; } 

[NotMapped] 
public TimeSpan ValidityPeriod 
{ 
    get { return TimeSpan.FromTicks(ValidityPeriodTicks); } 
    set { ValidityPeriodTicks = value.Ticks; } 
} 
+2

Questo approccio potrebbe portare a query non ottimali quando qualcuno non sa o dimentica che ValidityPeriod è proprietà NotMapped. Se è utilizzato in un LINQ in cui la query EF non si lamenterà, verrà semplicemente trascinata la raccolta e l'iterazione. Per questo motivo è possibile utilizzare i metodi di accesso Get/Set obsoleti per chiarire che non devono essere utilizzati nelle query. – StanislawSwierc

+0

D'accordo, ho modificato il mio codice nella mia soluzione in modo che l'implementazione sia più chiara. – GraemeMiller

+4

Utilizzare i metodi di estensione per ottenere o impostare il valore e ci dovrebbero essere meno equivoci. – deerchao

1

Prima di tutto, MVC non ha nulla a che fare con questo problema. È interamente correlato a EF Code First e SQL Server, quindi è una questione DAL.

Una soluzione potrebbe essere quella di fornire un tipo di colonna personalizzata nella configurazione entità, in questo modo:

modelBuilder 
.Entity<MyClass>() 
.Property(c => c.MyTimeSpan) 
.HasColumnType("whatever sql type you want to use"); 
+0

Ok. È il tipo di sql che vuoi usare a cui tengo. Qual è il modo standard per mappare. TimeSpan su un campo server SQL. – GraemeMiller

+0

Ho pensato che fosse abbastanza chiaro. Il parametro stringa del metodo HasColumnType deve contenere il tipo SQL come lo dichiareresti in uno script sql o in un designer di tabelle, come nvarchar (50) o bit o qualsiasi cosa di cui hai bisogno ed è compatibile con il tipo di dati .Net che stai utilizzando . Per qual è il tipo esatto da utilizzare nel tuo caso specifico, basta sperimentare. –

+5

Sapevo come cambiare il tipo di colonna, non è questo il problema. Sembra una mappatura dei problemi abbastanza comune. Net TimeSpan a SQL. Volevo sapere in particolare su quale sia il modo migliore per gestire la memorizzazione di. TimeSpan su server SQL. – GraemeMiller

3

Per quanto ne so non v'è alcun tipo di dati equivalente in SQL Server Per il periodo di NET. La corrispondenza più vicina è Tempo, ma, come hai sottolineato, supporta solo valori fino a 24 ore? http://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes.

Il seguente documento MSDN descrive questo http://msdn.microsoft.com/en-us/library/bb386909.aspx. Presumo che dal momento che non ci sia una soluzione elencata lì, non è attualmente possibile.

+1

Sì, non l'ho mai trovato lontano dalla mia risposta. EF sembra solo prendere la strana decisione di mapparlo al tipo di dati Time di SQL Server che ovviamente è una mancata corrispondenza – GraemeMiller

Problemi correlati