2009-06-01 22 views
25

Mam problem z kluczami podstawowymi w Entity Framework podczas korzystania z SQLite. SQLite żąda jawnej wartości NULL na liście VALUES w kolumnie kolumny z autodestrukcyjnym kluczem głównym. W rzeczywistości nie patrzyłem na wygenerowany kod SQL w kontekście EF, ale uważam, że dzieje się to zgodnie ze zwykłą konwencją SQL Server, która nie dostarcza wartości dla kolumny autokorelacji.SQLite z Entity Framework

Zgodnie z site dla dostawcy SQLite ADO.NET, EF jest w pełni obsługiwany, ale nie znajduję tam żadnej pomocy. Czy istnieje sposób zmuszenia EF do jawnego wstawiania wartości NULL dla wartości klucza podstawowego?

+0

Jestem w tej samej sytuacji. Próbowałem zastąpić długo na długo? w wygenerowanym kodzie, więc mogłem przynajmniej ustawić wartość null, ale to nie zadziałało. Komunikat o błędzie: "Zmiany w bazie danych zostały zatwierdzone pomyślnie, ale wystąpił błąd podczas aktualizowania kontekstu obiektu.Zamiast ObjectContext może być niespójny.Wewnętrzny komunikat wyjątku: Pary klucz-wartość, które definiują klucz EntityKey, nie mogą mieć wartości null lub pusty. \ r \ n Nazwa parametru: record ". Wydaje się, że nie ma sposobu, aby ominąć to, sqlite sposób obsługi autoinkrementacji jest trochę dziwny. – Pablote

+0

Zrezygnowałem z SQLite w połączeniu z EF. Istnieje post na temat tego samego problemu na forach w serwisie System.Data.Sqlite, ale nie było ruchu ani odpowiedzi przez jakiś czas. Przeniosłem się do SQL Compact, który przedstawia własne problemy. Nie można wykonywać "kluczy generowanych przez serwer" za pomocą EF/SQLCompact. Tak więc, na razie używam standardowego ADO dla ADO dla insertów i używam EF dla cukru LINQ. –

+0

To jest do bani. Sądzę, że ta sama "sztuczka" może być użyta w sqlite. Przetestowałem autoinkrementację z CE i linq do sql i wygląda na to, że działa. Nie próbowałem go z sqlite, nie jestem pewien, czy to nawet możliwe. – Pablote

Odpowiedz

18

Cóż, w końcu udało mi się to zrobić: D. Musisz ustawić kolumnę id jako autoinkrementację, w ten sposób działa z EF. Nie pytaj mnie, dlaczego nie jest to wspomniane w pytaniu o auto-inkrementacji w sqlite faq. To jest przykład:

create table Persona (PersonaID integer primary key autoincrement, Nombre text) 

Również nie znalazł sposób ustawić to od wewnątrz visual studio, musiałem to zrobić z narzędzia wiersza poleceń.

AKTUALIZACJA: Poniższy kod działa poprawnie.

PruebaDBEntities data = new PruebaDBEntities(); 

     foreach (int num in Enumerable.Range(1, 1000)) 
     { 
      Persona p = new Persona() { Nombre = "Persona " + num, Edad = num }; 

      data.AddToPersona(p); 

      data.SaveChanges(); 

      Console.WriteLine(p.PersonaID); 
     } 

PersonaID nie został ustawiony, a po operacji składowania miał wartość wyznaczoną przez sqlite.

+0

Widziałem to w niektórych postach, ale czy nie musisz jawnie wpisać NULL w instrukcji INSERT dla klucza podstawowego? "WSTAW W WARTOŚCI Persona (" Pablo ")" nie działa, musisz zrobić "WSTAWIĆ W WARTOŚCI Persona (NULL," Pablo ")" prawda? –

+0

Odpowiedziałem na post, więc kod mógł być ładnie sformatowany. – Pablote

+0

+1 Dziękuję, że pracowałeś dla mnie. – IamStalker

3

Miałem ten sam problem z EF i SQLite. Spróbuj sprawdzić drugi wpis: http://sqlite.phxsoftware.com/forums/p/1418/6162.aspx

Przyczyną mojego problemu było to, że AutoIncrement został dodany do samej bazy danych, ale model jednostka nie była właściwie odświeżona. Więc po odświeżeniu, moje pole wyglądał mniej więcej tak:

<Property Name="ID" Type="integer" Nullable="false" StoreGeneratedPattern="Identity" /> 

(StoreGeneratedPattern = „Identity” została dodana)

Przed odświeżania (ze starego modelu), po prostu starał Ustawianie identyfikatora Właściwość do 0, która działała również :)

12

Hooray ... Znalazłem rozwiązanie!

  1. Zadeklaruj kolumnę ID jako INTEGRALNY KLUCZ GŁÓWNY AUTOINCREMENT w instrukcji tworzenia tabeli. INTEGER PRIMARY KEY nie zadziała!
  2. Aktualizacja Entity Framework modelu w Visual Studio, ustaw StoreGeneratedPattern ID własności kolumna "wyliczona"
+3

Właśnie zrobiłem pierwszy krok, a następnie usunąłem i utworzyłem mój model EF. to jest to! W rzeczywistości obiekt StoreGeneratedPattern został teraz ustawiony na "Identity". Już działa. – OneWorld

+1

Zrobiłem też latanie ustawiając 'StoreGeneratedPattern' na" Tożsamość " – Christoph

1

Z książki "The Definitive Guide to SQLite" Czytam następujące pod pierwotnych kluczowych ograniczeń:

"W rzeczywistości jednak ta kolumna będzie po prostu aliasem dla ROWID. Wszystkie będą odnosić się do tej samej wartości."

Uważam, że jest to powód konieczności ustawienia AUTOINCREMENT w definicji kolumny.

5

Musisz ustawić autoinkrement na True. Możesz to zrobić bezpośrednio z VS, klikając ikonę (Zarządzaj indeksami i kluczami) z paska narzędzi, gdy jesteś w oknie tabeli projektu, a następnie zaktualizuj swój model.

image

0

wydaje dostawcy EF dla SQLite nie odebrać jako kolumny tożsamości (autoIncrement).

Najpierw dla bazy danych kliknij prawym przyciskiem myszy kolumnę w projektancie EDMX i ustaw StoreGeneratedPattern na Identity.