2009-02-25 12 views
41

Tengo una columna de fecha en la tabla que tiene un valor predeterminado o vinculante como getutcdate(). Quiero usar esto en el marco de la entidad. Al generar EDM, pude encontrar la propiedad "Valor predeterminado" en el nivel de la columna, pero creo que es para el valor codificado.Cómo usar el valor predeterminado de columna de DataBase en Entity Framework?

Háganme saber cómo puedo usar el valor predeterminado especificado en la base de datos.

Respuesta

4

StoreGeneratedPattern = "Computed" no es lo mismo que un valor predeterminado, porque esta propiedad se actualizará CADA VEZ con el valor predeterminado en la base de datos ... lo que significa que es imposible actualizarlo manualmente.

4

Puede establecer StoreGeneratedPattern en Identity, en cuyo caso EF lee el valor devuelto de la base de datos después de ejecutar la instrucción INSERT. El problema con este enfoque es que la próxima vez que se genere el mapeo XML, su cambio se perderá.

Otra forma de hacerlo es establecer el valor usted mismo en su código a DateTime.UtcNow. Puede establecer esto en el constructor de su entidad (definir un nuevo constructor si es necesario), o puede establecerlo en su propio controlador de eventos para el evento SavingChanges de contexto (vea How to: Execute Business Logic When Saving Changes (Entity Framework) para ver un ejemplo del manejo del evento SavingChanges).

0

Aquí hay una posible, pero no bastante solución -

Ajuste calcula sobre una columna hará que sea de sólo lectura, pero hará que el trabajo de valor predeterminado. Es posible tener una columna calculada real, digamos "LastChangedAt_computed" que muestra el valor de "LastChangedAt_default" o "LastChangedAt_manual".

Ahora, la columna calculada muestra el valor de la columna predeterminada, a menos que la columna manual no sea nula, en cuyo caso se muestra. En el modelo, el StoragePattern de la columna predeterminada debe ser "Computado".

Es una solución fea, pero debería funcionar.

9

Implementar el evento OnCreated para la entidad es la solución que he encontrado. Tenía una propiedad Guid que quería ser poblada. Por defecto, se estaba completando con todos los ceros (00000-0000-00000-etc). Al agregar lo siguiente a mi clase parcial de la entidad, pude tratar el problema.

partial void OnCreated() 
{ 
    Guid = Guid.NewGuid(); 
} 
+0

plantea la entidad este evento ¿automáticamente? ¿Dónde se conecta el controlador de eventos? –

+0

El evento está cableado automáticamente. – Heather

+0

¿Alguna documentación para esto? –

4

Un problema con la configuración StoreGeneratedPattern = "computarizada" o "identidad" es que no permiten que el cliente siempre proporcionar un valor. Encontrándose con este problema en insertos pero también para actualizaciones.

Parece que se necesita otra opción o dos para StoreGeneratedPattern para que la base de datos pueda al menos ver los valores proporcionados por el usuario, pero anularlos si es necesario. Esto permitiría que cualquier activador de actualización o inserción DB existente actualice un campo basado en otro campo para que funcione. Por ejemplo, un activador de DB en una actualización puede actualizar la marca de tiempo modificada solo si no se proporciona una y solo si se actualizaron ciertos campos.

Quizás la característica de atributos ampliados de columna en SQL Server podría usarse para establecer ese campo automáticamente durante la extracción, de modo que no terminemos editando archivos XML.

+1

Para inserciones en campos no anulables, funcionaría una configuración como "ComputedIfNull". EF no insertaría ese campo y luego devolvería lo que fuera comprometido en el campo por el motor (debido a la columna predeterminada, activador, etc.). – crokusek

0

lo que he encontrado que es bastante sencilla es crear una clase parcial para el modelo (s) entidad similar a lo que se hace para las anotaciones de datos. Luego anulo el constructor predeterminado y establezco las propiedades predeterminadas en el constructor. Funciona de maravilla.

public partial class CallHistoryLog { public CallHistoryLog() { this.NumberFromId = -1L; this.NumberFromName = "NO NAME"; this.NumberToId = -1L; this.NumberToName = "NO NAME"; this.RouteId = -1L; this.Viewed = false; this.Deleted = false; this.DateCreated = DateTime.Now; } }

0

Hmm ... si está utilizando EF6, esto es realmente mucho más fácil de lo que parece. Simplemente abra su modelo, haga clic con el botón derecho en la columna para la que desea establecer un valor predeterminado, elija propiedades y verá el campo "DefaultValue". Solo completa eso y ahorra. Configurará el código para usted.

El problema con algunas de las otras soluciones, es que si bien pueden funcionar inicialmente, tan pronto como reconstruya el modelo, arrojará cualquier código personalizado que haya insertado en el archivo generado por la máquina.

Así que bajo el capó del interfaz de usuario funciona mediante la adición de una propiedad adicional para el archivo edmx:

<EntityType Name="Thingy"> 
    <Property Name="Iteration" Type="Int32" Nullable="false" **DefaultValue="1"** /> 

y añadiendo el código necesario para el constructor:

public Thingy() 
{ 
    this.Iteration = 1; 
Cuestiones relacionadas