entity-framework entity-framework-4.1 code-first

entity framework - Código de EF Primera columna de solo lectura



entity-framework entity-framework-4.1 (2)

EF core 1.1 o versiones posteriores sí, puede usar la propiedad de solo lectura en clases de poco. Lo que necesitas hacer es usar el campo de respaldo.

public class Blog { private string _validatedUrl; public int BlogId { get; set; } public string Url { get { return _validatedUrl; } } public void SetUrl(string url) { using (var client = new HttpClient()) { var response = client.GetAsync(url).Result; response.EnsureSuccessStatusCode(); } _validatedUrl = url; } }

clase MyContext: DbContext {public DbSet Blogs {get; conjunto; }

protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(b => b.Url) .HasField("_validatedUrl"); }

}

y api fluida ...

modelBuilder.Entity<Blog>() .Property(b => b.Url) .HasField("_validatedUrl") .UsePropertyAccessMode(PropertyAccessMode.Field);

Echa un vistazo aquí ..

Estoy usando el Código EF primero con el primer enfoque de la base de datos "con Database.SetInitializer (null);"

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

Ahora lo que quiero hacer es hacer que esto se lea solo desde el primer punto de vista del Código EF. Es decir, quiero poder ver las fechas de fecha de creación y de modificación de mi aplicación, pero no quiero modificar estos datos.

Intenté usar modificadores privados en el configurador, pero no tuve suerte. Cuando intento agregar nuevos datos a la tabla, trató de ingresar DateTime.Max fecha a la base de datos que produce un error desde el servidor SQL.

¿Alguna idea?


No puede usar modificadores privados porque el propio EF necesita configurar sus propiedades cuando está cargando su entidad y Code First solo puede hacer esto cuando una propiedad tiene un configurador público (a diferencia de EDMX, donde los establecedores privados son posibles (1) , (2) ) .

Lo que debe hacer es marcar su CreatedDate con DatabaseGeneratedOption.Identity y 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 será pasada 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 usted desea.

Puedes 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 invalida en su contexto derivado:

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