J'utilise un modèle produit avec Devart Entity Developer (fichier .edml, que je comprends est principalement similaire à .edmx) pour générer des classes Entity dont les relations sont initialisées dans une classe DbContext. Le schéma de base de données ne spécifie pas PK pour View1 et toutes les colonnes sont nullables. Mais la génération de code suppose que pour les vues dépourvues de clé primaire, toutes les colonnes sont la clé. À savoir, le .ssdl a toutes les colonnes sous l'élément clé et le DbContext a .IsRequired() spécifié sur tout, comme ceci:Représenter la vue sans clé dans Entity Framework
Extrait SSDL:
...
<EntityType Name="View1">
<Key>
<PropertyRef Name="FirstCol" />
<PropertyRef Name="Col2" />
<PropertyRef Name="LastCol" />
</Key>
<Property Name="FirstCol" Type="VARCHAR2" Nullable="false" MaxLength="4000" />
<Property Name="Col2" Type="VARCHAR2" Nullable="false" MaxLength="120" />
<Property Name="LastCol" Type="VARCHAR2" Nullable="false" MaxLength="20" />
</EntityType>
....
De DbContext:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
#region View1
modelBuilder.Entity<View1>()
.HasKey(p => new { p.FirstCol, p.Col2, p.LastCol})
.ToTable("View1", "Owner");
// Properties:
modelBuilder.Entity<View1>()
.Property(p => p.FirstCol)
.HasColumnName("FirstCol")
.IsRequired()
.HasMaxLength(4000)
.HasColumnType("VARCHAR2");
modelBuilder.Entity<View1>()
.Property(p => p.Col2)
.HasColumnName("Col2")
.IsRequired()
.HasMaxLength(120)
.HasColumnType("VARCHAR2");
modelBuilder.Entity<View1>()
.Property(p => p.LastCol)
.IsRequired()
.HasMaxLength(20)
.HasColumnType("VARCHAR2");
Cela provoque une exception NullReferenceException lorsque l'interrogation renvoie une ligne avec l'une des colonnes PK ayant une valeur null.
Existe-t-il un moyen de représenter une vue dans EF sans spécifier de clés ou modifier le schéma de base de données? J'ai trouvé ceci: http://elegantcode.com/2012/03/15/querying-entityframework-views-without-a-key/
Est-ce la solution préférée? Je suppose que je pourrais aussi utiliser DefiningQuery, mais cela semble dupliquer le sql qui a été utilisé pour générer la vue?
J'ai essayé et je reçois une erreur 'ORA-00904: « Extent1 » « Id »:. Identifiant invalide 'lorsque vous essayez d'interroger Linq sur les entités. Je vois que le sql généré par l'EF essaie de rechercher une colonne d'identifiant qui n'existe pas. Avez-vous suggéré de mettre à jour la vue de la base de données pour avoir un rowid? Ma question était de faire des changements sans altérer la base de données. – ossek
Nous avons modifié notre réponse.S'il vous plaît noter que l'algorithme décrit fonctionne pour les vues créées sans utiliser des constructions comme UNION, GROUP BY etc. – Devart
Merci pour vos commentaires et éditer. Malheureusement, la définition de la vue implique UNIONs. Y aurait-il une autre pseudocolonne ou convention que je pourrais utiliser à la place de ROWID? – ossek