Dada una tabla de base de datos con una columna que contiene datos históricos pero que ya no se completa, ¿hay alguna forma en Entity Framework de leer la columna pero evitar que se actualice cuando se usa el mismo objeto modelo?
Por ejemplo, tengo un objeto.
public class MyObject { public string CurrentDataColumnName { get; set; } public string HistoricDataColumnName { get; set; } }De la documentación, no creo que pueda hacer nada de lo siguiente, porque esto evitará que EF lea los datos y los conserve.
(1) Decore la propiedad HistoricDataColumnName con el siguiente atributo
[NotMapped] (2) Agregue lo siguiente a mi EntityTypeConfiguration para MyObject
Ignore(x => x.HistoricDataColumnName)Puede marcar la columna como calculada para evitar que Entity Framework actualice/inserte en esa columna.
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] public string HistoricDataColumnName { get; set; }Una característica importante de la base de datos es la capacidad de tener propiedades calculadas. Si está asignando sus clases de Code First a tablas que contienen columnas calculadas, no desea que Entity Framework intente actualizar esas columnas. Pero desea que EF devuelva esos valores de la base de datos después de haber insertado o actualizado los datos. Puede usar la anotación DatabaseGenerated para marcar esas propiedades en su clase junto con la enumeración calculada. Otras enumeraciones son Ninguno e Identidad.
En cuanto al código, puede establecer el setter simplemente en protected . EF utiliza la reflexión para materializar su modelo. Creo que el setter ahora oculto también muestra a todos los demás programadores que el campo ya no debe modificarse.
También agregue un atributo [Obsoleto] con más información, por qué la propiedad ya no se puede establecer desde el público.
Simplemente puede usar IsModified para verificar si una propiedad de entidad específica se modificó o no y, de esta manera, aún puede leer, insertar y eliminar datos:
var item = context.MyObjects.Find(id); item.CurrentDataColumnName = "ChangedCurrentDataColumnName"; item.HistoricDataColumnName = "ChangedHistoricDataColumnName"; context.Entry(item).Property(c => c.HistoricDataColumnName).IsModified = false; context.SaveChanges(); Al usar IsModified = false , está excluyendo la actualización de la propiedad HistoricDataColumnName , por lo que la columna HistoricDataColumnName no se actualizará en la base de datos, pero se actualizarán otras propiedades.
Establecer este valor en falso para una propiedad modificada revertirá el cambio al establecer el valor actual en el valor original. Si el resultado es que ninguna propiedad de la entidad se marca como modificada, la entidad se marcará como Sin cambios. Establecer este valor en falso para las propiedades de las entidades agregadas, sin cambios o eliminadas no es operativo.
Verifique la siguiente respuesta como una explicación complementaria. También podría ser útil: