Asignación de vistas de la base de datos al código de EF 5.0 primero con migraciones

Estoy tratando de asignar una vista SQL a una entidad en EF 5.0 Code First w / Migrations para mostrar información básica en una página sin tener que consultar varias tablas para esa información (que actualmente toma ~ 20 segundos para cargar. NOT GOOD. ) He oído que es posible hacerlo, pero no he podido averiguar ni encontrar en línea una forma de hacerlo correctamente.

EDITAR: Para ver más a fondo mi solución a este problema, lea esta publicación del blog sobre el tema.

Aquí está mi vista:

CREATE VIEW [dbo].[ClientStatistics] AS SELECT ROW_NUMBER() OVER (Order By c.ID) as Row, c.LegacyID, c.ID, c.ClientName, slc.AccountManager, slc.Network, (SELECT MAX(CreatedDate) AS Expr1 FROM dbo.DataPeriods WHERE (ClientID = c.ID)) AS LastDataReceived, (SELECT MAX(ApprovedDate) AS Expr1 FROM dbo.DataPeriods AS DataPeriods_2 WHERE (ClientID = c.ID)) AS LastApproved, (SELECT MAX(ReportProcessedDate) AS Expr1 FROM dbo.DataPeriods AS DataPeriods_1 WHERE (ClientID = c.ID)) AS LastReportProcesssed FROM dbo.Clients AS c INNER JOIN dbo.SLClients AS slc ON c.ID = slc.ClientID 

Aquí está la entidad:

 public class ClientStatisticsView { [Key] public int Row { get; set; } public int LegacyID { get; set; } public int ClientID { get; set; } public string ClientName { get; set; } public string AccountManager { get; set; } public string Network { get; set; } public DateTime LastDataReceived { get; set; } public DateTime LastApproved { get; set; } public DateTime LastReportProcessed { get; set; } } 

Y finalmente mi mapeo en DbContext :

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); modelBuilder.Entity().ToTable("ClientStatistics"); base.OnModelCreating(modelBuilder); } 

Todo esto me da el siguiente error:

There is already an object named 'ClientStatistics' in the database.

¿Qué estoy haciendo mal? ¿Hay alguna manera para mí para lograr esto, o debería estar haciendo otra cosa en su lugar?

Ha especificado que la entidad ClientStatisticsView debe asignar a una tabla denominada “ClientStatistics”. Entonces, el marco de la entidad generará una migración que contiene una instrucción para crear esa tabla. Pero ha creado esa vista de forma independiente en la base de datos, por lo que para evitar el error que está recibiendo, debe eliminar la instrucción CreateTable de la migración Up .

Creo que una mejor manera de hacerlo es crear la vista en la migración ejecutando sql de esta manera:

 public override void Up() { Sql("EXEC ('CREATE View [dbo].[ClientStatistics] AS --etc" } public override void Down() { Sql(@"IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'dbo.ClientStatistics')) DROP VIEW dbo.ClientStatistics)") } 

De esa forma, sus vistas y tablas se especifican en un solo lugar y puede migrar de forma segura hacia arriba y hacia abajo

Referencia

http://elegantcode.com/2012/04/12/entity-framework-migrations-tips/

De hecho, estoy trabajando con Entity Framework “Code First” y vistas, la forma en que lo hago es así:

1) Crea una clase

 [Table("view_name_on_database")] public class ViewClassName { // View columns mapping public int Id {get; set;} public string Name {get; set;} // And a few more... } 

2) Agregue la clase al contexto

 public class ContextName : DbContext { // Tables public DbSet ATable { get; set; } // And other tables... // Views public DbSet ViewContextName { get; set; } // This lines help me during "update-database" command protected override void OnModelCreating(DbModelBuilder modelBuilder) { // Remove comments before "update-database" command and // comment this line again after "update-database", otherwise // you will not be able to query the view from the context. // Ignore the creation of a table named "view_name_on_database" modelBuilder.Ignore(); } } 

Un poco tarde, pero espero que esto ayude a alguien.

Si hubiera una manera de ignorar la creación de una tabla denominada como la vista durante “actualización-base de datos” y no ignorar después de esto, sería genial.

Agregue el atributo ToTable a su entidad e inclúyalo como un DbSet en su contexto.

 [ToTable("ClientStatics")] public class ClientStaticsView{} public class DataContext : DbContext { public DbSet ClientStatics { get; set; } } 

O si no desea agregar el DbSet a su contexto, cree una EntityTypeConfiguration para su ClientStatisView e incluya el atributo ToTable con la API fluida en lugar de un atributo. A continuación, puede agregar la entidad a su contexto en OnModelCreating de su contexto:

 public class ClientStaticsViewConfiguration : EntityTypeConfiguration { public ClientStatusViewConfiguration { ToTable("ClientStatics"); } } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Configurations.Add(new ClientStatisViewConfiguration()); }