2011-12-14 19 views

Respuesta

33

Según mi previous question sobre cómo almacenar TimeSpan en SQL que estaba previsto para almacenarla como segundo o entradas etc. Al final no correlacioné la columna TimeSpan ya que no hay un equivalente en el servidor SQL. Simplemente creé un segundo campo que convirtió TimeSpan en ticks y lo guardé en DB. entonces me impidió almacenar el TimeSpan

public Int64 ValidityPeriodTicks { get; set; } 

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

Este enfoque puede llevar a consultas poco óptimas cuando alguien no sabe u olvida que ValidityPeriod es la propiedad NotMapped. Si se usa en un LINQ donde la consulta EF no se quejará, simplemente extraerá la colección e iterará sobre ella. Por este motivo, uno puede usar los accesadores Get/Set de la vieja moda para dejar en claro que no se deben usar en las consultas. – StanislawSwierc

+0

De acuerdo, he ajustado mi código en mi solución para que la implementación sea más clara. – GraemeMiller

+4

Use los métodos de extensión para obtener o establecer el valor, y debe haber menos malentendidos. – deerchao

1

Antes que nada, MVC no tiene nada que ver con este problema. Está completamente relacionado con EF Code First y SQL Server, por lo que es un asunto de DAL.

Una solución podría ser la de proporcionar un tipo de columna personalizada en la configuración de su entidad, así:

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

Ok. Es el tipo de sql que quieras usar, me importa. ¿Cuál es la forma estándar de asignar .Net TimeSpan a un campo de servidor SQL. – GraemeMiller

+0

Pensé que era lo suficientemente claro. El parámetro de cadena del método HasColumnType debe contener su tipo SQL como lo declararía en un script sql o en un diseñador de tablas, como nvarchar (50) o bit o cualquier cosa que necesite y sea compatible con el tipo de datos .Net que está utilizando . Para cuál es el tipo exacto para usar en su caso específico, simplemente experimente. –

+5

Supe cómo cambiar el tipo de columna, ese no es el problema. Parece que es un problema bastante común el mapeo de .Net TimeSpan a SQL. Quería saber específicamente cuál es la mejor manera de gestionar el almacenamiento de .Net TimeSpan en el servidor SQL. – GraemeMiller

3

Por lo que yo sé no hay ningún tipo de datos equivalente en SQL Server para TimeSpan de .NET. La coincidencia más cercana es Tiempo, pero, como señaló, solo admite valores de hasta 24 horas. http://msdn.microsoft.com/en-us/library/ms186724.aspx#DateandTimeDataTypes.

El siguiente documento de MSDN describe esto http://msdn.microsoft.com/en-us/library/bb386909.aspx. Supongo que, dado que no hay ninguna solución allí, actualmente no es posible.

+1

Sí, nunca me encontré lejos de mi respuesta. EF solo parece tomar la extraña decisión de asignarlo al tipo de datos de tiempo del servidor SQL, que obviamente es un desajuste – GraemeMiller

Cuestiones relacionadas