2012-03-09 11 views
9

Następujący kod zgłasza wyjątek "EntitySqlException:" Group "jest zastrzeżonym słowem kluczowym i nie można go używać jako aliasu, chyba że jest on uniknięty. Blisko linii 1, kolumna 11".Jak używać słowa kluczowego sql sql w nazwie właściwości w kontekście danych struktury jednostki?

Moje pytanie brzmi po pierwsze: dlaczego istnieje jakaś relacja między nazwą kolekcji, którą wybieram w kontekście danych a zapytaniem, jakie jest wygenerowane zapytanie sql?

Po drugie, czy jest coś, co mogę zrobić, oprócz zmiany nazwy nieruchomości w moim kontekście, aby ją rozwiązać (wiem, że nazwa jest głupia, są powody, dla których nie mogę zmienić nazwiska, tak jak bym chciał, że nie wejdę tutaj)?

Czy jest coś, co mogę zrobić z modelemBuilder?

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

Już sobie sprawę, że nazwa jest głupi, więc +1 tam :) Group jest zarówno ogólny termin (zamiast odnoszące się do danych, które posiada) i zarezerwowane słowo dla LINQ. Czy próbowałeś zamiast tego pełnej składni LINQ 'var e = FROM in ctx.Group', aby sprawdzić, czy się przedostaje? Jeśli * możesz * wyjaśnić, dlaczego nie możesz zmienić nazwy, która może pomóc? –

+0

Dzięki, tak, powody, dla których nie mogę zmienić nazwy, nie mają charakteru technicznego, więc nie sądzę, że mogliby tu pomóc. Nawiasem mówiąc, są jeszcze inne rzeczy, które mógłbym nazwać, co skutkowałoby tym samym wyjątkiem, na przykład "Using, As, Select", więc jestem zainteresowany, aby wiedzieć, czy nie można zmienić nazwy nieruchomości, zanim skorzystam z faktu, że to nie jest powód, aby to zmienić (wraz z innymi powodami, o których wspomniałeś), jeśli widzisz co mam na myśli :-) – kmp

+0

Powtarzam: Czy wypróbowałeś pełną składnię 'var e = FROM in ctx.Group' LINQ zamiast tego sprawdzić, czy się przedostaje? Teoretycznie tworzy to samo IL pod maską, ale warto spróbować. –

Odpowiedz

1

Jest to poprawione w wersjach EF 4.3.1 i EF 5.0 beta1. Użyj NuGet, aby zaktualizować pakiet EntityFramework do najnowszej wersji. Na przykład, w konsoli Menedżer pakietów, uruchom:

Update-Package EntityFramework 
+0

Dziękuję bardzo! Zaktualizowałem do wersji 4.3.1 (byłem na 4.3) i wszystko działało dobrze. – kmp

0

Zawsze można wprowadzić liczbę mnogą, tak jak w Grupach, aby było słowem "niezarezerwowanym".

+0

dzięki, tak, moje pytanie brzmiało, jak mogę obejść to bez zmiany nazwy nieruchomości i myślę, że rzeczywista odpowiedź to "nie możesz - to błąd w strukturze encji" – kmp

1

Po chwili patrzenia na to doszedłem do wniosku, że odpowiedź na moje pytanie jest taka, że ​​nie jest to możliwe.

To nie jest wielka sprawa, ponieważ mogę zmienić nazwę nieruchomości, ale myślę, że jest to coś, co powinno "po prostu zadziałać", więc podniosłem problem dotyczący połączenia MS, który można znaleźć tutaj: Using a sql reserved keyword as the name of a collection on a DbContext causes an exception. Jeśli zostanie to rozwiązane lub odrzucone, ponieważ jest to rzeczywiście możliwe, zaktualizuję tę odpowiedź.