2009-10-22 25 views
12

En mi esquema de base de datos de SQL Server que tienen una tabla de datos con un campo de fecha que contiene un valor por defecto deCómo utilizar el valor predeterminado Entity Framework y fecha predeterminada valores

CONVERT(VARCHAR(10), GETDATE(), 111) 

que es ideal para insertar automáticamente la fecha en el nuevo registro al ingresar registros manualmente en la base de datos.

El problema que tengo es que cuando se usa Entity Framework y mapeo del campo de Fecha, Entity Framework inserta un valor predeterminado de DateTime.Min cuando se crea una instancia de la entidad.

No puedo asignar el campo Fecha a un DateTime con nulos, es decir, DateTime ?, ni puedo usar CONVERT o DateTime.Now.Today en el valor predeterminado de Entity Designer, ya que solo acepta valores constantes codificados .

Por supuesto, puedo establecer explícitamente el campo DateTime en C# cada vez que se crea el objeto, explícitamente en código, en el constructor de una clase parcial o incluso durante el evento de guardar cambios.

¿Hay alguna otra forma de lograr lo que quiero, donde en realidad se usa el cálculo del valor predeterminado almacenado en la tabla de la base de datos?

+0

Puede intentar configurar el campo como generado automáticamente. Nunca lo he intentado y no estoy seguro de qué tan bien funcionaría. –

+0

Miré a mi alrededor en el Diseñador de EDM y no vi ninguna opción, elementos de menú o propiedades que pudiera describir como que ofrecen eso. ¿Dónde encontraría "establecer campo como generado automáticamente" dentro del diseñador? Supongo que se refiere al diseñador, y no algo en SQL Server. ¿O tal vez se refiere a la "especificación de columna calculada?" – Justin

+1

http://msdn.microsoft.com/en-us/library/dd296755.aspx –

Respuesta

1

Acabo de toparme con esto - trabajé alrededor al establecer la fecha (el campo que necesitaba autogenerado) en el constructor de la Entidad usando un método parcial. Si esto es Ideal o si funciona en todos los casos aún no se ha visto, pero ha solucionado mi problema hasta el momento.

+1

Esta es la solución que finalmente elegí. Parece un poco complicado, pero funciona a la perfección. Una pena que tal supervisión esté presente en el EF. – Justin

+0

Me alegro de haber ayudado, esperemos que EF4 solucione este dolor. Si crees que esta es la mejor solución que puedas encontrar, por favor márcalo como la respuesta (o al menos véndelo) para que pueda obtener algo de crédito. Estoy intentando crear al menos suficientes representantes para utilizar este sitio de forma un poco más activa. . ¡Gracias! –

+1

Yo haría eso, pero requiere 15 reputación. Lo siento. – Justin

5

Puede usar un database trigger, que, al insertar, comprueba si el valor insertado es DateTime.MinValue (01.01.0001) y lo reemplaza con el valor calculado que desea. Esta MSDN article describe cómo crear un desencadenador.

Un pequeño "error": con esta solución, debería almacenar el nuevo objeto en la base de datos y leerlo luego para actualizar su objeto con el valor calculado.

+2

Buen punto. Eso funcionaría también. Pero parece que estoy empuñando un mazo para romper una nuez. – Justin

0

¿El campo de fecha se puede asignar a DateTime? solo si la columna es anulable en la base de datos.

+0

Pero si la columna es anulable, la lógica dicta que no puede tener un "valor predeterminado". Y este es el comportamiento que exhibe el servidor SQL. – Justin

14

Cree una clase parcial para su EntityObject, agregue un constructor predeterminado y establezca valores predeterminados en él.

public partial class YourDBObject 
    { 
      public YourDBObject() 
      { 
       this._DateField = DateTime.Now; 
      } 
    } 
+0

¡Exactamente lo que necesitaba (aunque no para esta pregunta)! : D – nathanchere

+3

Gracias. Esto funciona, aunque al principio me confundió porque también se llama al constructor cuando se extraen objetos existentes de la base de datos; sin embargo, en esos casos, el 'DateTime.Now' se sobrescribe con los valores de la base de datos después de la construcción. – codeulike

1

Tuve un problema similar con los Servicios de RIA con Entity Framework. No pude establecer el valor en el constructor predeterminado en el lado del cliente porque las clases de entidad que se generan allí ya tienen un constructor predeterminado vacío.

La solución que utilicé fue implementar el método parcial OnCreated para la entidad en el cliente estableciendo el valor predeterminado requerido.

2

Esto es realmente lamentable. Las respuestas que hacen referencia al StoreGeneratedPattern no son una solución verdadera, eso no le permite establecer el valor.

Todo el equipo tendría que hacer es algo como esto:

[Required] 
    [DefaultValue] // suggested attribute, whatever you want to call it 
    public DateTime Created { get; set; } 

Si un campo está marcado ValorPredeterminado, a continuación, en el momento de la generación de SQL de EF, propiedades con este atributo se comprueban si field == default(DateTime), si es así, entonces simplemente omita esa columna del código generado.

0

Acaba de cruzar este problema. Entity Framework no admite valores predeterminados por sí mismo. Debe establecer la propiedad StoreGeneratedPattern = Calculada en la columna en la entidad de archivo Edmx. El valor predeterminado de lo que establezca en la Base de datos prevalecerá sobre qué EF establece de forma predeterminada, por ejemplo, DateTime.Min

Cuestiones relacionadas