2012-03-09 6 views
9

Il seguente codice genera l'eccezione "EntitySqlException: 'Gruppo' è una parola chiave riservata e non può essere utilizzata come alias, a meno che non sia sfuggita. Vicino alla riga 1, colonna 11".Come posso utilizzare una parola chiave riservata sql nel nome di una proprietà in un contesto di dati del framework di entità?

La mia domanda è in primo luogo perché c'è qualche relazione tra il nome della collezione che scelgo sul mio contesto dati e, sembra che la query sql che viene generata?

E in secondo luogo, c'è qualcosa che posso fare, oltre a rinominare la proprietà nel mio contesto, per risolverlo (so che il nome è stupido, ci sono ragioni per cui non posso cambiare il nome, per quanto mi piacerebbe, che non entrerò qui)?

C'è qualcosa che posso fare con il ModelBuilder forse?

public class GroupEntity 
{ 
    public int GroupEntityId { get; set; } 
    public string Name { get; set; } 
} 

public class MyContext : DbContext 
{ 
    public MyContext(string nameOrConnectionString) 
     : base(nameOrConnectionString) 
    { 
     Group = Set<GroupEntity>(); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<GroupEntity>().ToTable("GroupEntities"); 
     base.OnModelCreating(modelBuilder); 
    } 

    public DbSet<GroupEntity> Group { get; private set; } 
} 

//... 
using (var ctx = new MyContext("valid connection string")) 
{ 
    var e = ctx.Group.Count(a => a.GroupEntityId % 2 == 0); 
    // Exception thrown here 
    Console.WriteLine(e); 
} 
+2

Avete già capito che il nome è stupido, così uno non :) Gruppo è sia un termine generico (invece che relativo ai dati che detiene) e una parola riservata per LINQ. Hai provato la sintassi completa di 'var e = FROM a in ctx.Group' per vedere se si intrufola? Se * potresti * spiegare perché non puoi rinominarlo come aiuto? –

+0

Grazie, sì, i motivi per cui non posso cambiare il nome non sono tecnici, quindi non credo che potrebbero aiutare qui. Per inciso, ci sono altre cose che avrei potuto chiamare, che comporterebbero la stessa eccezione, ad esempio "Uso, Come, Seleziona", quindi sono interessato solo a sapere se è possibile non rinominare la proprietà prima di usare il fatto che non è il motivo per cambiarlo (insieme agli altri motivi che hai menzionato), se vedi cosa intendo :-) – kmp

+0

Per ripetere: hai provato la sintassi completa di 'var e = FROM a in ctx.Group' LINQ invece per vedere se si intrufola? In teoria crea lo stesso IL sotto il cofano, ma vale la pena provare. –

risposta

1

Questo valore è fissato in EF 4.3.1 e EF 5.0 beta1. Utilizzare NuGet per aggiornare il pacchetto EntityFramework all'ultima versione. Per esempio, nella console Package Manager, eseguire:

Update-Package EntityFramework 
+0

Grazie mille! Ho aggiornato a 4.3.1 (ero su 4.3) e ha funzionato bene. – kmp

0

È sempre possibile renderlo plurale, come Gruppi per renderlo una parola "non riservata".

+0

grazie, sì, la mia domanda era come posso aggirarlo senza cambiare il nome della proprietà però e penso che la risposta effettiva è "non puoi - è un bug nel framework di entità" – kmp

1

Quindi, dopo un po 'di tempo, ho concluso che la risposta alla mia domanda è che non è possibile.

Questo non è un affare enorme, dato che posso rinominare la proprietà, ma penso che sia qualcosa che dovrebbe "solo lavoro" e così ho sollevato un MS collegare problema per questo che può essere trovato qui: Using a sql reserved keyword as the name of a collection on a DbContext causes an exception. Se questo viene risolto o rifiutato perché è effettivamente possibile aggiornerò questa risposta.

Problemi correlati