23

Tengo una aplicación de Windows que trabaja con una base de datos SQL Compact 4.0, utilizando EF 4.1 y el enfoque de primer código. No puedo guardar un objeto a la base de datos desde que estoy recibiendo una excepción, con la excepción interna "Un desbordamiento se produjo durante la conversión de fecha y hora" al intentar guardar el tipo de cotización:Se produjo un desbordamiento al convertir a fecha y hora utilizando EF4

public class Quotation 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public DateTime DateCreated { get; set; } 

    public ContactPerson ContactPersonAssigned { get; set; } 

    public string OurReference { get; set; } 

    public string QuotationDataString { get; set; } 
} 

leí que este El error puede deberse a una falta de coincidencia entre la configuración de mi aplicación y la configuración de la base de datos compacta sql con respecto a la conversión de una fecha. No estoy seguro, ya que mi archivo de base de datos sdf tiene un campo que se llama correctamente "DateCreated", no admite nulos y de tipo "datetime".

Soy nuevo en SQL compact. ¿Podrías ayudarme a depurar este problema?

+3

¿Ha establecido 'DateCreated' en su aplicación en' DateTime.Now'? –

+1

Cometí un error estúpido. En algún lugar del código DateCreated era nulo. – Francesco

+2

¿Puedes responder tu propia pregunta de una manera que pueda ayudar a los demás? Si lo haces, puedes seleccionar el tuyo como la respuesta correcta. Puede parecer extraño, pero es la forma preferida de lidiar con situaciones como esta. – Will

Respuesta

87

Si su modelo tiene propiedades que no admiten nulos de tipo DateTime, cuando publica un formulario con el valor vacío para esa propiedad, se establece automáticamente en DateTime.MinValue, que está en .net 01/01/0001 (DateTime.MinValue on MSDN)

(Como nota al margen, puede cambiar este comportamiento implementando su propio IModelBinder para DateTime, que podría arrojar una excepción de validación si el valor intentado es nulo/vacío y la propiedad no puede contener nulos).

Si intenta guardar ese valor (DateTime.MinValue) en la base de datos, obtendrá un error de conversión si el campo de la base de datos es de tipo sql datetime, porque .net DateTime.MinValue es menor que SQL datetime minvalue (01/01/1753) y por lo tanto no se puede convertir a un valor sql. (SQL datetime min value on MSDN)

Este error no se producirá en las nuevas versiones de MS SQL Server, que tienen datetime2 tipo de datos que permite valores de 01/01/0001 a 31/12/9999 (SQL datetime2 on MSDN) (si datetime2 se utiliza para ese campo , por supuesto).

+6

Es una pena ver que no se aceptan respuestas tan buenas. –

+0

gracias. gran respuesta –

1

Ésta es una cuestión de edad ... pero tal vez alguien podría encontrar útil esta información:

He resuelto el problema (MVC4, EF5, SqlServerCe 4.0) usando siguiente definición:

public DateTime? DateFrom { get; set; } 
public DateTime? DateTo { get; set; } 

Que se diviertan!

1

Tenía el mismo problema, la proxima fecha y hora que se guardaba en un objeto para la base de datos era nula inicialmente.

Verifique que se haya asignado realmente un datetime antes de guardar el objeto en la base de datos local de CE.

Cuestiones relacionadas