Achievements für Visual Studio 2010

achievementsAls ich heute morgen Facebook geöffnet habe um mal zu schauen was die letzten Tage so passiert ist, konnte ich meinen Augen kaum trauen. Ich habe dort auch den Ticker der dotnetpro abboniert und las, dass es für Visual Studio 2010 jetzt ein Achievementsystem gibt. Ich dachte eigentlich erst es sei ein Scherz. Da jedoch erst Januar und noch nicht April ist, war das Ganze doch recht unwahrscheinlich.

Ich habe es mir aus Spaß einfach mal installiert und es ist doch lustig zu sehen, was für Achievements bei einem aktuellen Projekt plötzlich so auftauchen :-)

Meldung von dotnetpro : Hier lesen

Download / Installation : Hier klicken

entityFrameworkIconIn der aktuellen Phase meines Projektes bin ich dabei eine möglichst optimale Art und Weise zu entwickeln, mit Hilfe des Entity Frameworks, Objekte aus der Datenbank auszulesen und in meine Businessobjekte umzuwandeln. Eine Notwendigkeit ist dabei die ausgelesenen Objekte vom jeweiligen Kontext zu lösen. Dies erreicht man beim EntityFramework durch die Methode ‘context.Detach( object )‘.

Ich musste allerdings feststellen, dass Objekthierarchien dabei verworfen werden. Objekte die über Foreign Keys eigentlich schon geladen wurden sind nach dem Detach() dann plötzlich ‘null‘. Es wird in der .NET Dokumentation sogar noch darauf hingewiesen, allerdings nicht erwähnt wie man diese behalten kann. Wie also löse ich einen ganzen Objektgraphen vom Kontext ?

Nach einiger Recherche fand ich heraus, dass dies über die ‘MergeOptions‘ einer Tabelle erreicht werden kann. Man setzt die MergeOptions einer EntityTabelle einfach auf “NoTracking“. Voraussetzung ist dann allerdings, dass man die Objektgraphen selbst manuell über includes läd.

using ( var myContext = new ContextBla( connectionstring ) )
{
   myContext.Tabelle1.MergeOption = MergeOption.NoTracking;

   var objects = from x in myContext.Tabelle1.Include("Tabelle2")
                 select x;

   return objects.First();
}

Berechtigungen im Quellcode über Enums

TransactionIconDa ich bei meinem aktuellen Projekte sowohl die Services als auch den Client mittels Berechtigungen absichern muss, war die Umsetzung der Berechtigungen eine wichtige Frage für mich. Diese habe ich relativ einfach aber dennoch effektiv mit Enumerations lösen können. Berechtigungen setzen sich bei meiner Anwendung aus einem Bereich wie z.B. Studenten, Studiengänge o.ä. und einem dazugehörigen Zugriffsrecht wie z.B. Lesen, Schreiben, o.ä. zusammen.

Beide Werte werden über Enumerations in Kombination mit Flags zusammengesetzt. In der Datenbank werden dann allerdings nur einzelnen Flagwerte gespeichert. Meine Enumeration sieht z.B. folgendermaßen aus :

Bereiche ( AccessDomains.cs )

Berechtigungen ( AccessMode.cs )

In der Datenbank kann ich nun für jeden Benutzer eine Kombination aus Bereich und Berechtigung speichern. So z.b. 128 | 3

Dies würde dann bedeuten, dass der Benutzer für den Bereich SVStudenten die Zugriffsrechte Lesen und Schreiben hat. Aber wie komme ich denn auf 3 ? In der Codedatei stehen ja nur Lesen und Schreiben als einzelne Werte. Man kann diese Werte allerdings mittels eines ‘&‘ bzw. eines ‘|‘ kombinieren. Schreibe ich z.b.

var myberechtigung = AccessMode.Read & AccessMode.Write;
int berechtigungCode = (int)myberechtigung; // = 3

so erhalte ich einen AccessMode Wert der beide beinhaltet und als int gecastet dann den addierten Wert ergiebt. Das funktioniert allerdings nur dann, wenn man das Attribut “[Flags]” in der Klasse angibt und die Flagschreibweise in der Enumeration verwendet und ausschließlich Bitwerte nutzt.
Um mir später dann die Kontrolle zu erleichtern kann ich auch den Berechtigungscheck relativ einfach gestalten. Dieser sieht bei dem folgenden Beispiel ähnlich:

var myAuth = AccessMode.Read & AccessMode.Write;

if ( ( myAuth & AccessMode.Read ) == myAuth ) //returns true

if ( ( myAuth & AccessMode.Delete ) == myAuth ) //returns false

Berechtigungen im Code zu überprüfen ist wie man sieht also kein Hexenwerk und kann relativ einfach und sauber implementiert werden.

In meinem Studentenverwaltungsprojekt nutze ich das Entity Framework zum Abfragen von Daten sowie zum Abgeben von Änderungen an die Datenbank. Da ich jedoch in meiner Clientsoftware nicht direkt an die Datenbank gebunden bin und auf selbst erstellte ‘Businessobjekte‘ angewiesen bin, musste ich heute einen Weg finden Änderungen an solchen möglichst einfach und performant an meine Datenquelle weiter zu geben.

Da ich die Businessobjekte so konzipiert habe, dass sie eine Kopie einer entkoppelten EF Entity als Basis enthalten habe ich relativ leichtes Spiel. Zunächst habe ich es über die Funktion ‘Context.Attach( obj );‘ probiert, was jedoch dazu führte, dass keine Änderungen gespeichert wurden.

Ein paar Rechercheminuten führten mich dann auf folgenden Weg der auch für mich als Lösung  funktionierte :


using ( var context = new EntityContext( connectionstring ) )
{
   if ( detachedObject.EntityState == EntityState.Detached )
   {
      object original = null;
      if ( context.TryGetObjectByKey( detachedObject.EntityKey, out original ) )
      {
         context.ApplyCurrentValues<T>( context.T.EntitySet.Name, detachedObject );
      }
   }
}

Ich werde demnächst etwas ausführlicher über die Struktur meiner Businessobjekte berichten.


      

Um mich selbst ein bisschen besser bei Laune zu halten möchte ich auf meinem Blog ab heute Phasenweise etwas über die Fortschritte meines derzeitigen Projektes schreiben. Mein Projekt ist dabei gleichzeitig auch der Rote Faden, der meine Bachelorarbeit begleiten soll. Diese ist nun schon seit nahezu 2 Jahren fällig und es wird Zeit hier endlich mal den Sack zu zu machen.

In den vergangenen paar Monaten habe ich immer wieder an einem kleinen Projekt gearbeitet und die Idee weiterentwickelt eine Anwendung zu schreiben die komplett servicebasiert ist. Die Anwendung selbst soll dabei eine Software zur Verwaltung von Studenten und Studiengängen sein. Profitieren könnten davon z.b. Universitäten oder private Weiterbildungsunternehmen. Und genau so ist die Anwendung auch stukturiert.

Den ganzen Beitrag lesen »