2011-07-03 17 views
20

Estoy utilizando el código EF primero con el primer enfoque de la base de datos. "con Database.SetInitializer (null);"Primer código de EF columna de solo lectura

Mi tabla tiene dos columnas createddate y amendddate. Son administrados por SQL Server usando desencadenadores. La idea es que cuando la entrada de datos ocurre, estas columnas obtienen datos a través de desencadenantes.

Ahora lo que quiero hacer es hacer que esta lectura solo desde el primer punto de vista del Código EF. Es decir. Deseo poder ver la fecha de creación y las fechas de membrecía de mi aplicación, pero no quiero modificar estos datos.

He intentado usar modificadores privados en setter pero no tuve suerte. Cuando trato de agregar nuevos datos a la tabla intenté ingresar la fecha DateTime.Max en la base de datos que arroja el error desde el servidor SQL.

¿Alguna idea?

Respuesta

32

No puede usar modificadores privados porque EF necesita establecer sus propiedades cuando está cargando su entidad y Code First solo puede hacerlo cuando una propiedad tiene public setter (a diferencia de EDMX donde los setters privados son posibles (1), (2)) .

Lo que necesita hacer es marcar su CreatedDate con y su AmendDate con DatabaseGeneratedOption.Computed. Eso permitirá a EF cargar correctamente los datos de la base de datos, volver a cargar los datos después de insertarlos o actualizarlos para que la entidad esté actualizada en su aplicación y al mismo tiempo no le permitirá cambiar el valor en la aplicación porque el valor establecido en la aplicación nunca se pasará a la base de datos. Desde una perspectiva orientada a objetos, no es una solución muy buena, pero desde la perspectiva de la funcionalidad es exactamente lo que quiere.

Puede hacerlo ya sea con anotaciones de datos:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
public DateTime CreatedDate { get; set; } 
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public DateTime AmendDate { get; set; } 

O con API fluida en OnModelCreating anulación en su contexto derivada:

modelBuilder.Entity<YourEntity>() 
      .Property(e => e.CreatedDate) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity); 
modelBuilder.Entity<YourEntity>() 
      .Property(e => e.AmendDate) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
+0

Gracias por la rápida respuesta. ¿Cuál es la diferencia entre DatabaseGeneratedOption.Identity y DatabaseGeneratedOption.Computed? No puedo encontrar muchos detalles sobre esto en la web. thx edit: no responda que obtuve mi respuesta: http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.databasegeneratedoption(v=vs.103).aspx. Te dejaré saber cómo va muchas gracias – daehaai

+0

Eso ha resuelto el problema. muchas gracias – daehaai

+0

cuando puse el atributo [DatebaseGenerated (DatabaseGeneratedOption.Identity)] para la propiedad CreatedDate que obtengo, Update-Database: La columna de identidad 'CreatedDate' debe ser del tipo de datos int, bigint, smallint, tinyint o decimal o numérico con una escala de 0, y restringido a ser no anulable. – koraytaylan

Cuestiones relacionadas