Category Archives: Uncategorized

CI und CD für GitHub mit AppVeyor

In diesem Post zeige ich wie sich Continuous Integration und Continuous Delivery für ein GitHub Repository umsetzen lässt. Dabei soll ein .NET Projekt bei jeder Änderung gebuildet und auf manuelles zu tun released werden (neuer Git Release inkl. Tag und NuGet-Package auf NuGet.org). Dafür verwende ich AppVeyor. Als Beispiel Projekt dient https://github.com/msallin/SQLiteCodeFirst.

Continue reading

Entity Framework CodeFirst für SQLite

Der ORM Mapper aus dem Hause Microsoft namens “Entity Framework” unterstützt ein sehr nützliches und häufig verwendetes Feature bzw. Ansatz namens “CodeFirst”.
“CodeFirst” ist nichts anderes als die automatische Generierung einer (SQL)-Datenbank, basierend auf dem geschrieben Code (Model). Dabei wird auf convention over configuration gesetzt und so generiert der folgende Code eine Datenbank mit zwei Tabellen inkl. Primary- und Foreign-Keys.

public class Player
{
	public int Id { get; set; }
	public string FirstName { get; set; }
	public string LastName { get; set; }
	public Team Team { get; set; }
}

public class Team
{
	public int Id { get; set; }
	public string Name { get; set; }
	public ICollection<Player> Players { get; set; }
}

In einem laufenden Projekt, an dem ich mitarbeite, soll eine SQLite Datenbank einsetzt werden.

SQLite ist eine Programmbibliothek, die ein relationales Datenbanksystem enthält. SQLite unterstützt einen Grossteil der im SQL-92-Standard festgelegten SQL-Sprachbefehle. Unter anderem implementiert SQLite Transaktionen, Unterabfragen (subselects), Sichten (views), Trigger und benutzerdefinierte Funktionen.

Quelle: Wikipedia

Der Datenbank Zugriff wird mit dem Entity Framework realisiert. Die Entity Framework Unterstützung für SQLite lässt sich über ein NuGet Package hinzufügen: https://www.nuget.org/packages/System.Data.SQLite.

Leider unterstützt SQLite bzw. das SQLite NuGet-Package den CodeFirst-Ansatz nicht. Über diesen Post bin ich auf ein Stück Code gestossen, dass rudimentär den CodeFirst Ansatz implementiert: https://gist.github.com/flaub/1968486e1b3f2b9fddaf

Da ich für das Projekt noch ein paar weitere Funktionalitäten hinzufügen musste und der Code produktiv eingesetzt wird, habe ich beschlossen ein Refactoring durchzuführen und diesen Code wiederum auf GitHub zu veröffentlichen.

Das Resultat findet sich hier:
SQLite CodeFirst
Was alles unterstützt wird und wie die Library verwendet werden kann, ist im GitHub ReadMe beschrieben: Zum ReadMe.

TypeScript Greeter mit RequireJS und Knockout

Im Rahmen eines aktuellen Projektes beschäftige ich mich mit TypeScript und diversen JavaScript Frameworks, darunter RequireJS und KnockoutJS. Aus diesem Grund habe ich als kleines Beispiel den “Greeter” (Template wenn ein neues Visual Studio TypeScript Projekt angelegt wird) mittels eben diesen zwei Frameworks realisiert. Es ist alles andere als “Rocket Science”, kann jedoch für den Anfang ganz nützlich sein. Der Code ist auf GitHub verfügbar: https://github.com/msallin/TypeScript_RJS_Sample

Aus “SwissXrm” wird “SwissCoder”

Aufgrund eines beruflichen Paradigmenwechsel bin ich nicht mehr im Bereich Dynamics CRM tätig. Beruflich orientiere ich mich verstärkt in Richtung Individualsoftware-Entwicklung. Aus diesem Grund betreibe ich den Blog unter einem generischeren Titel weiter. Dem Microsoft Umfeld bleibe ich treu. In Zukunft sind Posts über C#, .Net, Asp.Net, TypeScript, Azure und vieles mehr zu erwarten.

In eigener Sache: Now hosted on Azure

Bisher war der Blog auf wordpress.org gehostet. Um die Werbung loszuwerden und mehr Freiheiten zu haben, habe ich mich entschieden den Blog selbst zu hosten. Dabei ist meine Wahl auf Microsoft Azure gefallen. Ich setze dabei auf eine Azure Website (Scale: Basic – Small).

Im folgenden Post erkläre ich kurz wie ich die Migration durchgeführt habe und was es zu beachten gilt.

Continue reading

Impersonating/ActOnBehalf Benutzer NACH dem erstellen des IOrganizationServices

Die Klasse CrmConnection bietet eine sehr komfortable Möglichkeit um sich zu einem CRM Webservice zu verbinden. Sie verfügt über ein Property “CallerId”, mit dem es möglich ist ein Benutzer zu impersonaten.
Wird nun von der “CrmConnection” aus ein “IOrganizationService” erstellt (Instanz von “OrganizationService”) und die “CallerId” der CrmConnection nachträglich geändert, interessiert das den “OrganizationService” herzlich wenig.

Ein “OrganizationServiceProxy” verfügt ebenfalls über das Property “CallerId”.
Der Konstruktur besitzt jedoch keine Überladung die eine Instanz der “CrmConnection” Klasse erwartet.

Der folgende Code zeigt wie eine nachträgliche Impersonation trotzdem möglich ist.

var typedOrganizationService = organizationService as OrganizationService;
if (typedOrganizationService != null)
{
    var organizationServiceProxy = typedOrganizationService.InnerService as OrganizationServiceProxy;
    if (organizationServiceProxy != null)
    {
        organizationServiceProxy.CallerId = userId;
    }
    else
    {
        logger.Error("Impersonation failed! The OrganizationService.InnerService was not an implemenation of OrganizationServiceProxy.");
    }
}
else
{
    logger.Error("Impersonation failed! The IOrganizationService was not an implemenation of OrganizationService.");
}