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.
ASP.NET MVC Collection und Checkbox Binding
Dieser Post zeigt wie eine Collection an eine View gebunden werden kann, damit eben diese Collection beim Postback, vom ModelBinder, wieder deserialisiert werden kann.
Dabei soll das boolean Property als Checkbox dargestellt werden.
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
Asp.net MVC Clientside DateTime Validation
Die Clientseitige Validation von Asp.net MVC berücksichtigt, im Gegensatz zur Serverseitigen Validation, nicht das allenfalls am Model angegebene DateTime Format und schon gar nicht die Browser- oder Betriebssystemsprache.
Continue reading
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: Project Nami (WordPress on Azure SQL)
Nach der Migration auf Azure lies die Performance etwas zu wünschen übrig.
Deshalb habe ich mich entschieden, eine Möglichkeit zu suchen, WordPress auf Azure SQL laufen zu lassen. Ich habe mich dabei für Project Nami (Website, GitHub) entschieden.
Continue reading
System.Diagnostics.Trace in Textbox
In manchen Applikationen wird intensiv gebrauch von Tracing gemacht. Für Debugging Zwecke kann es nun nützlich sein, die Tracing Messages, Realtime, in einer Textbox auszugeben. Das folgende Snippet zeigt wie sich der Trace in einer Texbox anzeigen lässt. Continue reading
Weshalb die “mscorlib.dll” heisst wie sie heisst
Die “mscorlib.dll” beinhaltet unter anderem den Kern des .Net Frameworks (das grundlegende Typensystem und vieles mehr) ohne “mscorlib.dll” kein .Net und auch keine CLR. Aber wie setzt sich dieser Dateiname zusammen? Continue reading
Dynamics CRM API: E-Mail von Template erstellen
Das CRM bietet die Möglichkeit, E-Mail Templates zu erstellen. Basierend auf diesen Templates können dann neue E-Mails erstellt werden. Das Funktioniert natürlich auch über die API.
Als erstes der Code um eine E-Mail Template bei gegebenem Namen zu holen. Nebst dem Namen wird auch noch der TypeCode berücksichtigt. Der TypeCode ist nichts anderes als der Schemaname der Entität, für die das Template erstellt wurde.
private Guid GetTemplateIdByName(string templateName, string templateTypeCode) { var query = new QueryByAttribute("template"); query.AddAttributeValue("title", templateName); query.AddAttributeValue("templatetypecode", templateTypeCode); return organizationService.RetrieveMultiple(query).Entities.Single().Id; }
In einem zweiten Schritt wird vom Template, mit Hilfe des “InstantiateTemplateRequest”, eine neue E-Mail erstellt. Das heisst, es wird ein neuer Record vom der Entity “E-Mail” im Response zurückgegeben. Dieser Record wurde jedoch im CRM erstellt. Der InstantiateTemplateRequest erwartet die folgenden Properties:
- ObjectI: Die Id des Records für den die E-Mail erstellt werden soll
- ObjectType: Der Name des Records für den die E-Mail erstellt werden soll
- TemplateId: Die Id des Templates welches verwendet werden soll
private Email CreateEmailFromTemplate(Entity regardingEntity, string templateName) { var templateId = GetTemplateIdByName(templateName, "contact"); var request = new InstantiateTemplateRequest { ObjectId = regardingEntity.Id, ObjectType = regardingEntity.LogicalName, TemplateId = templateId }; var repsonse = (InstantiateTemplateResponse)organizationService.Execute(request); return repsonse.EntityCollection.Entities.Single().ToEntity<Email>(); }
Schlussendlich kann die, vom Template generierte, E-Mail bearbeitet (z.B. Hinzufügen Empfänger) und mit einem “CreateRequest” erstellt werden. Wie ich dieser E-Mail dann ein Attachment hinzufügen und sie schlussendlich versenden kann, zeige ich in meinem Post von nächster Woche.
var email = CreateEmailFromTemplate(myCase, "myTemplate") email.Id = organizationService.Create(email);