Comment puis-je utiliser d'abord la vue de la base de données dans le code du cadre d'entité,
Comment puis-je utiliser d'abord la vue de la base de données dans le code du cadre d'entité,
Réponses:
Si, comme moi, vous êtes uniquement intéressé par la cartographie d'entité provenant d'une autre base de données (un erp dans mon cas) pour les relier à des entités spécifiques de votre application, alors vous pouvez utiliser les vues comme vous utilisez une table (mapper la vue dans de la même façon!). Évidemment, si vous essayez de mettre à jour ces entités, vous obtiendrez une exception si la vue ne peut pas être mise à jour. La procédure est la même que dans le cas des entités normales (basées sur une table):
Utilisez un fichier FooViewConfiguration pour définir un nom différent pour la vue (en utilisant ToTable ("Foo"); dans le constructeur) ou pour définir des propriétés particulières
public class FooViewConfiguration : EntityTypeConfiguration<FooView>
{
public FooViewConfiguration()
{
this.HasKey(t => t.Id);
this.ToTable("myView");
}
}
Ajoutez le fichier FooViewConfiguration au modelBuilder, par exemple en survolant la méthode OnModelCreating du Context:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new FooViewConfiguration ());
}
[Table("myView")]
c'est sans doute plus simple que d'utiliser la création d'un fichier EntityTypeConfiguration
.
Cela peut être une mise à jour, mais pour utiliser les vues avec EF Code, ajoutez d'abord simplement [Table ("NameOfView")] en haut de la classe et tout devrait fonctionner correctement sans avoir à passer par tous les obstacles que tout le monde traverse. Vous devrez également signaler l'une des colonnes en tant que colonne [clé]. Voici mon exemple de code ci-dessous pour l'implémenter.
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; }
}
}
Et voici à quoi ressemble le contexte
using System.Data.Entity;
namespace SomeProject.Data
{
public class DatabaseContext : DbContext
{
public DbSet<SomeView> SomeViews { get; set; }
}
}
Si tout ce que vous voulez est un groupe d'objets dé-normalisés, vous pouvez simplement créer une IQueryable<TDenormolized>
propriété publique en lecture seule dans votre DbContext
classe.
Dans le, get
vous renvoyez un résultat Linq pour projeter les valeurs dé-normoalisées dans vos objets dé-normalisés. Cela peut être mieux que d'écrire une vue DB car vous programmez, vous n'êtes pas limité par l'utilisation d' select
instructions uniquement . Il est également sûr de type de compilation.
Faites juste attention à ne pas déclencher d'énumérations comme des ToList()
appels, qui briseraient la requête différée et vous pourriez finir par récupérer un million d'enregistrements de la base de données et les filtrer sur votre serveur d'applications.
Je ne sais pas si c'est la bonne façon, mais j'ai essayé et ça marche pour moi.
Je sais que c'est une vieille question et il y a beaucoup de réponses ici, mais j'ai forcé à un problème lorsque j'utilise cette réponse et une erreur s'est produite lorsque j'utilise la commande update-database dans la console du gestionnaire de package:
Il existe déjà un objet nommé '...' dans la base de données.
et j'utilise ces étapes pour résoudre ce problème:
J'espère que cela aide.
migrationBuilder.Sql("CREATE OR REPLACE VIEW ...
); Pour que les collègues puissent également l'utiliser pour mettre à niveau leur base de données.