2010-04-29 15 views
18

que tienen una columna como ésta en 1 de mis tablas de la baseCómo gestionar GetDate() con Entity Framework

DateCreated, datetime, default(GetDate()), not null 

Estoy tratando de utilizar el marco de la entidad para hacer una inserción en esta tabla como esto .. .

 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 corro 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 traté de establecer la StoreGenerat edPattern calculado ... lo mismo, luego identidad ... lo mismo. ¿Algunas ideas?

Respuesta

2

Cambiar el tipo de DateCreated to 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

+0

que resuelve la excepción, pero el valor predeterminado (GetDate()) no se llama en la inserción. –

+0

en realidad, parece que funciona, pero el código .net está configurando como datetime.minvalue por defecto. ¿Hay alguna manera de evitar que haga esto? –

+2

lo obtuve funcionando utilizando la tienda Calculated storegeneratedpattern –

9

Tiene que editar manualmente el código XML edmx y establecer su SSDL StoreGeneratedPattern atribuye a la identidad o calculado. Pero cada vez que actualice su edmx a través del diseñador, sus cambios se sobrescribirán.

Se trata de un problema conocido. Por favor, consulte los siguientes enlaces para más detalles:

Microsoft Connect Ticket

Using a GUID as an EntityKey in Entity Framework 4

+0

Visual Studio 2010 le permite configurar esto ahora sin tener que editar el archivo edmx. – ICodeForCoffee

+0

@ICodeForCoffee como KenB menciona, actualmente hay un error y esta configuración en la interfaz de usuario de Visual Studio no se aplica correctamente al archivo .edmx. Realmente molesto :[ – RedFilter

2

Aquí es una solución de trabajo:

1) Cambie la columna a datetime2 como se ha mencionado en otro lugar. Esto corrige el error de conversión.

2) Agregue un activador que establece DateCreated para 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) En caso de necesidad, ajuste

p.DateCreated = DateTime.MinValue; 

sólo para inicializarlo.

4) Si se necesita el DateCreated de la base de datos, añadir

context.Refresh(System.Data.Objects.RefreshMode.StoreWins, p); 

justo después

context.SaveChanges(); 
4

que tenía el mismo problema! Para mí 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 

Entonces importar la tabla de base de datos para mi modelo de Entidades. ¡Las entidades no se darán cuenta del valor predeterminado! Por lo tanto, debe configurar el StoreGeneratedPattern de la columna en Computed. Entonces las entidades ya no pondrán ningún valor predeterminado.

combinación de:

datetime2, 
NOT NULL, 
StoreGeneratedPattern=Computed 

funciona para mí!

1

Enfocá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 del modelo para corregir el problema en el constructor:

public partial class Log 
{ 
    public Log() 
    { 
     this.Date = DateTime.Now; 
    } 
} 

Esto funciona para mí porque:

  • puedo crear el modelo en el momento de enviarlo a la base de datos.
  • Uso CLOUD para estos servicios, ¡la fecha y hora debe ser la misma tanto en los servidores de aplicaciones como en los de bases de datos!

No se olvide que el espacio de nombre debe coincidir con el espacio de nombres de modelo o parcial no debe enumerar las propiedades (y no debe ser parcial, así,])!

Cuestiones relacionadas