entity-framework - practices - entity framework precompiled query
Cómo administrar GetDate() con Entity Framework (5)
Tengo una columna como esta en una de mis tablas de base de datos
DateCreated, datetime, default(GetDate()), not null
Estoy tratando de usar Entity Framework para hacer una inserción en esta tabla como esta ...
PlaygroundEntities context = new PlaygroundEntities();
Person p = new Person
{
Status = PersonStatus.Alive,
BirthDate = new DateTime(1982,3,18),
Name = "Joe Smith"
};
context.AddToPeople(p);
context.SaveChanges();
Cuando ejecuto este código me sale el siguiente error
The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value./r/nThe statement has been terminated.
Así que intenté configurar StoreGeneratedPattern para computar ... lo mismo, luego la identidad ... lo mismo. ¿Algunas ideas?
¡Yo tuve el mismo problema! Para mi funciona así:
Base de datos MS SQL Server Express:
[RowTime] [datetime2](7) NOT NULL
ALTER TABLE [dbo].[Table_1] ADD CONSTRAINT [DF_Table_1_RowTime] DEFAULT (getdate()) FOR [RowTime]
GO
Luego importo la tabla de la base de datos a mi modelo de Entidades. ¡Las entidades no se darán cuenta del valor por defecto! Por lo tanto, debe establecer el StoreGeneratedPattern de la columna en Computed. Entonces las Entidades ya no pondrán ningún valor por defecto allí.
Combinación de:
datetime2,
NOT NULL,
StoreGeneratedPattern=Computed
¡Funciona para mi!
Aquí hay una solución de trabajo:
1) Cambie la columna a datetime2 como se menciona en otra parte. Esto corrige el error de conversión.
2) Agregar un disparador que establezca DateCreated a getdate ();
CREATE TRIGGER [TR_AS_ChangeTime] ON [AS_ApplicationSession]
AFTER INSERT,UPDATE AS
BEGIN
SET NOCOUNT ON;
UPDATE AS_ApplicationSession
SET AS_ChangeTime = getdate()
WHERE AS_Id IN(SELECT AS_ID FROM INSERTED)
END
3) Si es necesario, establecer
p.DateCreated = DateTime.MinValue;
Sólo para inicializarlo.
4) Si necesita el DateCreated de la base de datos, agregue
context.Refresh(System.Data.Objects.RefreshMode.StoreWins, p);
justo después de
context.SaveChanges();
Cambiar el tipo de DateCreated a datetime2 podría resolver el problema.
datetime 2007-05-08 12: 35: 29.123
datetime2 2007-05-08 12:35:29. 12345
Ref: http://technet.microsoft.com/en-us/library/bb677335.aspx67
Centrándome en el hecho de que no quiero cambiar la base de datos, ya que es un problema de aplicación y espero que resuelvan este problema algún día, mi solución (que es totalmente posible en mi caso) es crear una clase parcial del modelo. Para corregir el problema en el constructor:
public partial class Log
{
public Log()
{
this.Date = DateTime.Now;
}
}
Esto funciona para mí porque:
- Creo el modelo en el momento en que lo envío a la base de datos.
- ¡Utilizo CLOUD para estos servicios, la fecha y hora debe ser la misma en los servidores de aplicaciones y de bases de datos!
¡No olvide que el espacio de nombres debe coincidir con el espacio de nombres del modelo o parcial no debe incluir las propiedades (y tampoco debe ser parcial;)!
Tiene que editar manualmente el edmx xml y configurar sus atributos SSDL StoreGeneratedPattern en identidad o computados. Pero cada vez que actualice su edmx a través del diseñador, sus cambios se sobrescribirán.
Este es un problema conocido. Por favor, consulte los siguientes enlaces para más detalles: