¿Hay alguna forma de marcar una entidad como de solo lectura y no especificar ninguna clave para ella?Código Entity Framework First ReadOnly Entity
Respuesta
Hay un par de cosas que puede hacer para aplicar solo lectura en Code First. El primero es usar AsNoTracking()
cuando realiza una consulta.
var readOnlyPeople = (from p in context.People
where p.LastName == "Smith"
select p).AsNoTracking();
Esto le dice al primer Código no registrar los cambios a estas entidades, por lo que cuando se llama a SaveChanges()
no hay cambios realizados en estos objetos se conservará.
La segunda cosa que puede hacer es establecer el estado en Unchanged
antes de llamar al SaveChanges()
.
context.Entry(person).State = EntityState.Unchanged;
context.SaveChanges();
Esto le dice a Code First que ignore los cambios que se hayan realizado en esa entidad.
En cuanto a no tener una clave, todas las entidades deben tener una clave. Esto no necesariamente se correlaciona con una clave principal en la base de datos, sino que "debe identificar de forma única una instancia de tipo de entidad dentro de un conjunto de entidades".
Hola Brice, tus sugerencias no son soluciones ideales para mí (realmente preferiría simplemente marcar esa entidad como de solo lectura, que existe en NH) pero no creo que lo que deseo sea posible con una solución clara en EF todavía. Según "todas las entidades deben tener una clave", estoy de acuerdo con usted, pero a veces tiene que trabajar con algunas vistas y no tienen ninguna clave y si puedo marcar una entidad como de solo lectura, ¿por qué debería necesitar una clave? . – Otake
En realidad, puede utilizar una interfaz de marcador IReadOnlyEntity similar a la interfaz ICacheableEntity que se sugiere aquí (También hay publicaciones de blog que describen esto, cuando encontré el código originalmente, pero no pude encontrarlo) http://stackoverflow.com/a/ 6593261/34474 Hay algunos problemas con las relaciones entre ellos que debes tener en cuenta (si alguien está interesado, házmelo saber). Al final, estamos haciendo lo que Brice sugirió solo de una manera más automatizada. – Cohen
Si su vista no tiene una clave natural, puede agregar una para ayudar a EntityFramework. En la definición de vista: SELECT \t NEWID() como [VirtualKey] ... En Mapa de la Entidad: // clave principal this.HasKey (t => t.VirtualKey); – Elton
Al usar código primero en EF6, creé algunas entidades que reflejan Vistas, que obviamente no deberían modificarse ni guardarse. Para evitar que la Entidad sea cambiada, solía protegido propiedades de deformación:
public class TransplantCenterView
{
public string TransplantsThisYear { get; protected set; }
}
Marco de la entidad sigue siendo capaz de establecer esta propiedad, pero otros desarrolladores no pueden accidentalmente hacerlo sin un error en tiempo de compilación. Esto funciona muy bien, pero parece que la mejor solución sería eliminar el seguimiento por completo.
Gracias a reggaeguitar's answer, parece que hay una respuesta a esto (por favor, también votar su respuesta a si el siguiente es útil), que me ha permitido cambiar el código de:
public class MyContext : DbContext
{
public DbSet<TransplantCenterVeiw> TransplantCenterViews {get; set;}
}
a:
public class MyContext : DbContext
{
//appears the DbSet is still needed to make Set<Entity>() work
protected DbSet<TransplantCenterView> _transplantCenterViews {get; set;}
//this .AsNoTracking() disables tracking for our DbSet.
public DbQuery<TransplantCenterView> TransplantCenterViews {
get { return Set<TransplantCenterView>().AsNoTracking(); }
}
}
no sé de ningún pros y contras para esto, pero mi código existente ha seguido trabajando de manera impecable, por lo que parece una victoria.
Consulte mi respuesta para obtener una forma de deshabilitar el seguimiento en la entidad. – reggaeguitar
Devs _debería seguir llamando a MyContext.Set
Si se desea se puede hacer esto
/// Using a dbquery since this is readonly.
/// </summary>
public DbQuery<State> States
{
get
{
// Don't track changes to query results
return Set<State>().AsNoTracking();
}
}
fuente http://www.adamtuliper.com/2012/12/read-only-entities-in-entity-framework.html
Cambió DbSet a DbQuery. Cambió el getter a como se describe arriba. Compilado. Todo bien. Sin embargo, cuando voy a ejecutar la página que carga los datos de la vista, aparece un error de tiempo de ejecución: "El tipo de entidad' MyEntityName' no es parte del modelo para el contexto actual ". Por lo tanto, agregó 'DbSet protegido
Interesante, no recibí ese error. Estoy mapeando tablas y no vistas, ¿tal vez esa es la diferencia? – reggaeguitar
Hmm ... entonces, ¿no tiene una propiedad DbSet
- 1. Código de Entity Framework First IQueryable
- 2. Implementar Entity Framework Code First
- 3. Entity Framework Code First MySql Pluralizing Tables
- 4. MembershipUser y Entity Framework Code First
- 5. Entity Framework 4.1 RC: Código First EntityTypeConfiguration inheritance issue
- 6. Entity Framework 4.1 Código First Foreign Key Id's
- 7. ¿Cómo precompilo un código de Entity Framework-First Query?
- 8. Creando repositorio usando el código de Entity Framework First 4.3
- 9. Entity Framework Code First y Multiple Assemblies
- 10. Entity Framework - Code First Fluent API: ErrorMessage?
- 11. Entity Framework Code First y Database First Bug/Conflicto
- 12. Código de Entity Framework primero para Oracle
- 13. Cómo hacer que Entity Framework Data Context Readonly
- 14. ¿Cómo separe los objetos en Entity Framework Code First?
- 15. MVC3 Validación con Entity Framework Modelo/Base de datos First
- 16. Extraña actualización de entidad en Entity Framework Code-First
- 17. Entity Framework Code First y Connection String Issue
- 18. Código Entity Framework Primera conexión Azure
- 19. ASP.NET MVC3 y Entity Framework Code first architecture
- 20. Entity Framework - Code First no carga el objeto referenciado
- 21. Code-First Entity Framework insertando datos con ID personalizado
- 22. Entity Framework Code First y Criterios de búsqueda
- 23. Tipo SQL 'hora' en Entity Framework Code First
- 24. Code First Entity Framework - cambio cadena de conexión
- 25. Entity Framework Code First - Definición de relaciones/claves
- 26. ¿Puedo deshabilitar las relaciones automáticas en Entity Framework Code First?
- 27. Cómo almacenar imágenes utilizando Entity Framework Code First CTP 5?
- 28. Filtro con múltiples clases derivadas con Code-first Entity Framework
- 29. Uso de enumeraciones con Code First y Entity Framework 5
- 30. Ventajas y desventajas de Entity Framework 4 Code-First
Código Primera toda la entidad a ser de sólo lectura y sólo lectura son un poco mutuamente excluyentes. Solo por curiosidad, ¿por qué no quieres una clave principal? – Brian
Enttity se asigna a una vista y no quiero actualizar/insertar en él, y tampoco tengo ninguna clave. – Otake
EF no hará actualizaciones en las vistas de manera predeterminada. –