¿Cómo puedo usar la vista de la base de datos en el código del marco de la entidad primero?
¿Cómo puedo usar la vista de la base de datos en el código del marco de la entidad primero?
Respuestas:
Si, como yo, está interesado solo en mapear entidades provenientes de otra base de datos (un erp en mi caso) para relacionarlas con entidades específicas de su aplicación, entonces puede usar las vistas como usa una tabla (mapee la vista en de la misma manera!). Obviamente, si intenta actualizar esas entidades, obtendrá una excepción si la vista no es actualizable. El procedimiento es el mismo que en el caso de las entidades normales (basadas en una tabla):
Use un archivo FooViewConfiguration para establecer un nombre diferente para la vista (usando ToTable ("Foo"); en el constructor) o para establecer propiedades particulares
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
Agregue el archivo FooViewConfiguration al modelBuilder, por ejemplo, anulando el método OnModelCreating del contexto:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
esto es posiblemente más simple que usar la creación de un EntityTypeConfiguration
.
Esto puede ser una actualización, pero para usar vistas con EF Code primero, simplemente agregue [Table ("NameOfView")] a la parte superior de la clase y todo debería funcionar bien sin tener que pasar por todos los obstáculos por los que están pasando los demás. Además, deberá informar una de las columnas como una columna [clave]. Aquí está mi código de muestra a continuación para implementarlo.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace SomeProject.Data
{
[Table("SomeView")]
public class SomeView
{
[Key]
public int NameID { get; set; }
public string Name { get; set; }
}
}
Y así es como se ve el contexto
using System.Data.Entity;
namespace SomeProject.Data
{
public class DatabaseContext : DbContext
{
public DbSet<SomeView> SomeViews { get; set; }
}
}
Si todo lo que desea es un montón de objetos desnormalizados, entonces podría crear una IQueryable<TDenormolized>
propiedad pública de solo obtención en su DbContext
clase.
En el get
, devuelve un resultado de Linq para proyectar los valores desnormoalizados en sus objetos desnormalizados. Esto podría ser mejor que escribir una vista de base de datos porque está programando, no está limitado solo por usar select
declaraciones. También es seguro en tiempo de compilación.
Solo tenga cuidado de no activar enumeraciones como ToList()
llamadas, que romperán la consulta diferida y puede terminar obteniendo un millón de registros de la base de datos y filtrarlos en su servidor de aplicaciones.
No sé si esta es la forma correcta, pero lo intenté y me funciona.
Sé que esta es una pregunta antigua y hay muchas respuestas aquí, pero me vi obligado a tener un problema cuando uso esta respuesta y se produjo un error cuando uso el comando update-database en la Consola del Administrador de paquetes:
Ya existe un objeto llamado '...' en la base de datos.
y utilizo estos pasos para resolver este problema:
Espero eso ayude.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); Para que los colegas también puedan usarlo para actualizar su base de datos.