2012-10-06 7 views
9

Wie genau verarbeitet ServiceStack Ormlite standardmäßige und berechnete Spalten?ServiceStack OrmLite - Behandeln von Standardspalten und berechneten Spalten

Ich erhalte Insbesondere die Fehler

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

Diese Spalte als eine berechnete Spalte in einer SQL Server 2008-Datenbank konfiguriert ist.

OrmLite scheint etwas mit berechneten Spalten zu tun, da Sie das Attribut '[ServiceStack.DataAnnotations.Compute]' zu einer Eigenschaft in einem Modell hinzufügen können.

Beim Einstieg in den Code wird die Funktion 'ToInsertRowStatement' in 'OrmLiteDialetBase.cs' aufgerufen. Während diese Funktion überprüft, ob die AutoIncrement-Eigenschaft festgelegt ist, prüft sie nicht, ob die IsComputed-Eigenschaft festgelegt ist.

Ich weiß nicht, ob das ein Fehler ist oder wenn ich es nur falsch benutze.

+0

Ich würde versuchen, einen Check für IsComputed hinzuzufügen. Wenn das Problem dadurch behoben wird, erstellen Sie eine Pull-Anforderung auf github mit dem Bugfix. ServiceStack ist ein gut entwickeltes Programm, daher ist es unwahrscheinlich, dass es mehrere Stellen gibt, an denen diese Überprüfung stattfinden könnte. – theMayer

+0

Um meinen vorherigen Kommentar zu verdeutlichen, würden Sie dies im Quellcode tun und dann die Binärdatei neu kompilieren. Sollte nicht länger als ca. 5 Minuten dauern. – theMayer

Antwort

0

Ich surgest Sie erstellen Sie eine Ansicht mit den relevanten Spalten (mit Ausnahme der berechneten Spalten) aus der Tabelle und arbeiten Sie stattdessen von der Ansicht. Auf diese Weise vermeiden Sie Verweise auf unerwünschte berechnete Spalten. Einfache Ansichten können genauso behandelt werden wie normale Tabellen hinsichtlich Einfügen, Löschen, Aktualisieren und den meisten anderen Aspekten.

+0

Das ist irgendwie ... hacky. Ich hatte gehofft, dass es in ServiceStack eine eingebaute Methode gibt, dies zu tun. – John

+0

@john Es scheint, dass Sie gerade eine Art von Fehler in ServiceStack OrmLite erleben. Da ich Ihr Tool nicht reparieren kann, sollte eine Workaround die zweitbeste Sache sein, das ist meine Abhilfe zu einem Workaround. Andernfalls können Sie sich an die Personen wenden, die OrmLite erstellt haben, und eine Reparatur anfordern. –

6

Für meine berechnete Spalten, die nur in der Dienstschicht berechnet werden, weiß SQL nichts über sie, so habe ich eine Kombination der folgenden Eigenschaften auf dem servicestack Modell:

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

Der Unterschied scheint der zu sein, "Ignore" -Attribut, das darauf bestand, dass sein Namensraum angehängt wurde ?? Wenn diese vorhanden sind, werden meine grundlegenden Abfragen ausgeführt, andernfalls beschwert sich SQL, dass die Spalten nicht existieren - zu Recht!

Sie können, wie von t-clausen.dk vorgeschlagen, einen SQL-Filter verwenden, indem Sie speziell eine SQL CommandText-Zeichenfolge mit allen gewünschten Spaltennamen übergeben, aber ich denke, dass ein Wartungsproblem auftritt.

Wie bei einem Bugfix, der die Datenbank betrachtet, scheint es, dass die SQL pro Provider durch eine "toSqlString()" oder ähnliche Methode generiert wird. Also gibt es wahrscheinlich ein paar Stellen, auf die man achten sollte ...

EDIT: Es ist einfach das Ignore-Attribut, das den Job erledigt. Von der Quelle:

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

Es gibt auch die Möglichkeit, ein ALIAS zu verwenden, das ich nicht untersucht habe.

Verwandte Themen