Telerik OpenAccess ORM - Rozwiązanie problemu: Cannot insert explicit value for identity column in table...
Tym razem spróbujemy zawalczyć z Telerik OpenAccess ORM, w sytuacji gdy podczas insertów danych do bazy otrzymujemy złowrogi komunikat błędu: Cannot insert explicit value for identity column in table 'JakasTabela' when IDENTITY_INSERT is set to OFF.
W czym problem, przecież komunikat jest czytelny?
Oczywiście tak sformułowany komunikat o błędzie, w sposób bardzo jasny daje znać w czym rzecz. W trywialnym przypadku, z pozycji aplikacji ustalamy jakąś wartość właściwości encji, która odpowiada kluczowi głównemu tabeli w bazie (Primary Key), podczas gdy po stronie serwera SQL, oczekuje się że wartkość klucza głównego zostanie ustalona automatycznie. Jeśli faktycznie tak się sprawy mają, to rozwiązanie jest proste - zaprzestać uzupełniać tę własność encji, która odpowiada kluczowi głównemu - niech jego wartość zostanie ustalona przez serwer SQL.
A co jeśli wcale nie ustalamy tej wartości?
Jeżeli jednak wcale nie ustalamy w logice aplikacji w sposób jawny wartości klucza głównego, a mimo to podczas insertu do bazy otrzymujemy komunikat, to wiedz, że coś się dzieje!Otóż prawdopodobnie, wiemy gdzie leży problem. Na ogół w takiej sytuacji mamy źle zmapowaną bazę danych, a dokładniej mechanizm dodawania nowego wpisu. Taki stan udało mi się kilka razy osiągnąć w sytuacji gdy:
- zmapowałem bazę danych w aplikacji
- zauważyłem, że w strukturze tabeli brakuje dyrektywy identity dla klucza głównego (Microsoft SQL Server)
- poprawiłem strukturę tabeli i zaktualizowałem model bazy w aplikacji
Zapytać się można, dlaczego po aktualizacji modelu w aplikacji, nadal występuje ten błąd? Niestety nie mam pojęcia, natomiast doświadczenie nauczyło mnie, czego w tej aktualizacji brakuje i co należy zmienić ręcznie. A zatem:
- Po pierwsze: upewnijmy się w designerze modelu bazy, czy we właściwościach pola odpowiadającego kluczowi głównemu, parametr Identity jest ustawiony na true (najprawdopodobniej będzie po aktualizacji, a nawet i przed nią).
- Po drugie: sprawdźmy w designerze modelu bazy, właściwości całej tabelki dla jakiej poprawialiśmy strukturę, czy parametr Identity Mechanism jest ustawiony na DatabaseServerCalculated (a zapewne nie jest!).
Jeżeli przyszło nam zmienić Identity Mechanism, to i prawdopodobnie po takiej zmianie zniknie poruszany w tym wpisie problem. Niestety wygląda na to, ze wartość tego parametru ustawień dla tabeli w modelu... a właściwie już encji skoro w modelu, nie podlega modyfikacji podczas aktualizacji modelu z bazy, a szkoda. Choć oczywiście może stoi za tym jakaś głębsza logika. Tak czy inaczej istnieje zupełnie spore prawdopodobieństwo, że poradzimy sobie z tym problemem, w opisany powyżej sposób.
Komentarze (0) - Nikt jeszcze nie komentował - bądź pierwszy!