web-dev-qa-db-fra.com

Comment créer une vue en utilisant POCO de code EF d'abord

C'est simple. Je dois créer un View using Code First. Je n'ai rien trouvé à ce sujet sur Google ni SO. Y a-t-il un moyen d'accomplir cela?

J'ai besoin que cette vue soit créée et interrogée à l'aide de linq, ce n'est donc pas une solution pour la créer à l'aide d'un script de création de base de données, par exemple:

var results = from c in db.Customer
join v in db.MyView on c.Id equals v.Id
select c;

Un travail est également acceptable. J'ai besoin d'un moyen d'interroger des entités sur des valeurs non constantes/non-entités.

31
Chuck Norris

Vous ne pouvez pas créer de vues avec l'approche EF Code First. Si vous souhaitez créer une vue, exécutez le script SQL de création dans la méthode Seed. Mais vous ne pourrez toujours pas mapper une entité sur cette vue, à l'exception du modèle de piratage créé en créant et en supprimant un tableau portant le même nom que votre vue.

Quelques liens utiles:

9
Anatolii Gabuza

vous devez créer manuellement la vue, comme indiqué par AnatoliiG. ( Ajout d'index à une table ).

Vous ajoutez le nom de la vue en tant qu'attribut à votre classe

[Table("UserDTO")]
    public class UserDTO
{
    /* Class code here */
}

Vous pouvez créer une migration vide en spécifiant l'attribut -IgnoreChanges à la fin.

Add-Migration MigrationName -IgnoreChanges

Cela vous donne un script de migration vide que vous pouvez modifier manuellement. 

Vous pouvez utiliser votre contexte de base de données pour exécuter votre code dans votre script de migration.

public partial class editUserDTO : DbMigration
{
    public override void Up()
    {
        string script =
        @"
        CREATE VIEW dbo.UserDTO
        AS SELECT p.PersonId AS UserId, p.FirstName, p.LastName, u.UserName
        FROM dbo.Users u
        INNER JOIN dbo.People p ON u.PersonId = p.PersonId";
        BloggingContext ctx = new BloggingContext();
        ctx.Database.ExecuteSqlCommand(script);
    }

    public override void Down()
    {
        BloggingContext ctx = new BloggingContext();
        ctx.Database.ExecuteSqlCommand("DROP VIEW dbo.UserDTO");
    }
}
58
Fred

Juste un avertissement, dans EF 6.1 (je ne sais pas si auparavant ou non), il existe maintenant une option Code First from Database que vous pouvez utiliser et qui mappera également sur les vues.

Personnellement, j'ai le mien dans un projet de courrier indésirable distinct afin que je puisse simplement en extraire le code que je veux sans impact sur mon projet qui utilise réellement la base de données. Pour l'utiliser Add a New file to your project -> Data -> ADO.NET Entity Data Model

Ensuite, sélectionnez l'option Code First From Database et sélectionnez vos vues (et d'autres tables si vous le souhaitez)

Il le créera comme un mappage de table comme Fred parlait dans sa réponse, mais fera tout le code pour vous, ce qui est Nice. Cependant, vous voudrez probablement changer les index et l'ordre.

Ensuite, appelez simplement Sql(@"YOUR VIEW CREATE SQL HERE") dans votre Up et ajoutez un Sql(@"DROP STATEMENT HERE") dans votre Down

18
John

Beaucoup de bonnes idées tirées du fil officiel de EF7 :

1) Vous n'avez pas de DbSet, mais une méthode de propriété ou d'extension

Une propriété

class YourContext
{
    public IQueryable<YourView> YourView 
    {
        get
        {
            return this.Database.SqlQuery<YourView>("select * from dbo.YourView");
        }
    }
}

B) Méthode d'extension

static class YourContextExtensions
{
    public static IQueryable<YourView>(this YourContext context)
    {
        return context.Database.SqlQuery<YourView>("select * from dbo.YourView");
    }

2) Apparemment, le processus de migration peut ignorer certains dbsets

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
  if (IsMigration)
    modelBuilder.Ignore<YourViewTable>();
 ...
}

(Tout ce qui précède n'est pas testé)

5
Todd

Vous ne pouvez pas créer une vue à partir de EF Code Tout d'abord, vous devez ajouter le script dans le script "de démarrage" pour pré-remplir la vue. 

0
Debasis