query practices optimizar lento framework for example consulta best entity-framework sql-server-2008

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();



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:

Microsoft Connect Ticket

Uso de un GUID como EntityKey en Entity Framework 4