MC, 23:08 niedziela, 28.07.2013 r.
Ilustracja do artykułu: Telerik OpenAccess ORM - Rozwiązanie problemu: Cannot insert explicit value for identity column in table...

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!

Imię:
Treść: