2012-10-06 13 views
9

Jak dokładnie ServiceStack OrmLite obsługuje kolumny domyślne i obliczone?ServiceStack OrmLite - obsługa kolumn domyślnych i wyliczonych

Konkretnie Dostaję błąd

The column "PointsAvailable" cannot be modified because it is either a computed column or is the result of a UNION operator. 

Ta kolumna jest skonfigurowany jako kolumna obliczana w bazie danych SQL Server 2008.

OrmLite wydaje się robić coś z kolumnami obliczanymi, ponieważ można dodać atrybut "[ServiceStack.DataAnnotations.Compute]" do właściwości w modelu.

Po wejściu w kod wywoływana jest funkcja "ToInsertRowStatement" w "OrmLiteDialetBase.cs". Ta funkcja sprawdza, czy ustawiona jest właściwość AutoIncrement, ale nie sprawdza, czy właściwość IsComputed jest ustawiona.

Nie wiem, czy to błąd, czy też używam go nieprawidłowo.

+0

Chciałbym spróbować dodać czek dla IsComputed. Jeśli to rozwiąże problem, utwórz żądanie ściągnięcia na github z poprawką. ServiceStack jest dobrze zaprojektowanym programem, więc jest mało prawdopodobne, że istnieje wiele miejsc, w których może się to sprawdzić. – theMayer

+0

Aby wyjaśnić mój poprzedni komentarz, należy zrobić to w kodzie źródłowym, a następnie przekompilować plik binarny. Nie powinno zająć więcej niż około 5 minut. – theMayer

Odpowiedz

0

Wstawiam, że utworzysz widok z odpowiednimi kolumnami (z wyłączeniem kolumn obliczeniowych) z tabeli i zacznij pracować z widoku. W ten sposób unikasz odwołań do niechcianych kolumn obliczeniowych. Proste widoki można traktować tak samo, jak zwykłe tabele w odniesieniu do wstawiania, usuwania, aktualizowania i większości innych aspektów.

+0

To trochę ... hacky. Miałem nadzieję, że jest jakiś wbudowany sposób w ServiceStack, aby to zrobić. – John

+0

@john Wygląda na to, że obecnie doświadczasz jakiegoś błędu w ServiceStack OrmLite. Ponieważ nie mogę naprawić twojego narzędzia, obejście powinno być drugą najlepszą rzeczą, to jest moje przerażenie na obejście tego problemu. W przeciwnym razie możesz skontaktować się z osobami, które stworzyły OrmLite i poprosić o poprawkę. –

6

Dla moich kolumny obliczane, które są obliczane tylko w warstwie usług SQL wie nic o nich, więc użyłem kombinację następujących atrybutów modelu servicestack:

[Compute, ServiceStack.DataAnnotations.Ignore] 
public List<MyModel> MyList {get;set;} 

Różnica wydaje się być Atrybut "Ignoruj", który wymagał dołączenia przestrzeni nazw. Po ich wprowadzeniu działają moje podstawowe zapytania, w przeciwnym razie SQL skarży się, że kolumny nie istnieją - słusznie!

Możesz, zgodnie z sugestią t-clausen.dk, użyć filtru SQL, konkretnie przekazując ciąg SQL CommandText ze wszystkimi nazwami kolumn, które chcesz, ale myślę, że spowoduje to problem z konserwacją.

Jeśli chodzi o poprawkę dotyczącą bazy danych, wygląda na to, że SQL jest generowany dla każdego dostawcy przez "toSqlString()" lub podobną metodę. Więc prawdopodobnie istnieje kilka miejsc, na które warto zwrócić uwagę ...

EDYCJA: Jest to po prostu atrybut Ignoruj, który wykonuje zadanie. Od źródła:

/// IgnoreAttribute 
/// Use to indicate that a property is not a field in the table 
/// properties with this attribute are ignored when building sql sentences 

Istnieje również opcja użycia ALIAS, którego nie zbadałem.