2011-05-11 10 views
11

Por ejemplo, la mayoría de mis entidades tienen campos DateCreated y DateModified. Los valores predeterminados para estos se establecen en GetUtcDate() en SQL Server.¿Hay alguna manera fácil de hacer que EntityFramework use valores predeterminados de SQL?

Si intento crear una entidad y no establezco estos valores, recibo una excepción que dice que no puede ejecutar la inserción de SQL porque el valor de la fecha está fuera del rango. Tiene sentido porque las fechas predeterminadas de C# son 1/1/0001, mientras que la fecha mínima de SQL Server es 1/1/1753.

Entonces, ¿hay alguna manera en que pueda decirle a EF que use los valores predeterminados de SQL Server, o que NO intente e inserte columnas que no se hayan configurado?

Respuesta

12

Debe establecer StoreGeneratedPattern de esas propiedades a Identity para DateCreated y Computed para DataModified. Está disponible en diseñador. Una vez que lo haga, no podrá modificar esos valores en su aplicación; solo la base de datos puede establecer esas propiedades. Escribí sobre este some article porque esta característica tenía errores antes de VS2010 SP1, pero hay informes de que todavía no funciona a veces.

+0

. Gracias, lo intenté antes de publicarlo pero no funcionaba. Estoy usando VS 2010 Ultimate, SP1 y EF4 – Rachel

+0

En tal caso, compruebe que el patrón correcto generado en la tienda esté configurado tanto en CSDL como en SSDL como parte del archivo EDMX (debe abrirlo como XML) porque es una forma válida de hacerlo. –

+0

@Ladislav Estoy haciendo otra prueba, sin embargo, recibo errores acerca de la asignación de una columna que no admite valores NULL a una propiedad de entidad que admite nulos. ¿Sabes de qué está hablando? – Rachel

0

¿Ha intentado establecer el DefaultValue de la propiedad en la entidad?

+0

Realmente espero evitar tener que pasar por todas mis entidades y ajustar el valor predeterminado de cada propiedad. Además, significa que si cambio el valor predeterminado en el servidor SQL, necesito cambiar el valor predeterminado en EF y volver a compilar – Rachel

4

Una solución es anular la clase entitycontext generada utilizando parcial. Este interceptará inserciones/actualizaciones en todas las clases de entidad en su contexto EF:

public partial class MyEntities : ObjectContext 
{ 
    public override int SaveChanges(SaveOptions options) 
    { 
     this.DetectChanges(); 

     foreach (var insert in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added)) 
     { 
      if (insert.Entity.HasProperty("DateCreated")) 
       insert.Entity.GetType().GetProperty("DateCreated").SetValue(insert.Entity, DateTime.UtcNow, null); 
      if (insert.Entity.HasProperty("LastModified")) 
       insert.Entity.GetType().GetProperty("LastModified").SetValue(insert.Entity, DateTime.UtcNow, null); 
     } 

     foreach (var update in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified)) 
     { 
      if (update.Entity.HasProperty("LastModified")) 
       update.Entity.GetType().GetProperty("LastModified").SetValue(update.Entity, DateTime.UtcNow, null); 
     } 

     return base.SaveChanges(options); 
    } 
} 

O hacer algo similar, en busca de inserciones/actualizaciones en sus campos datestamp y retirarlos de la colección ObjectStateEntries?

Cuestiones relacionadas