C#

Entity Framework MySql mit SSH-Tunnel in Mono

Der Titel sagt schon dass es nicht gerade das ist was man gerne programmiert…

Kurz zu meiner Anwendung:
Ich möchte gerne Werte von einem Raspberry Pi auf meinem Uberspace in einer MySql Datenbank speichern. Erst wollte ich das auf Azure tun, leider wird hier Mono noch nicht korrekt unterstützt.

Dann eben in MySql… aber Uberspace lässt Zugriff auf die Datenbank nur per SSH zu.

Gut, dann bauen wir uns mal einen SSH-Tunnel in Mono. Hier gibt es ein schönes NuGet-Packeg namens SSH.NET

Die Objekte wie folgt initialisieren:

private const string passwordSsh = "myPassword";
private const string username = "myUsername";
private const string server = "my.server.de";
static ForwardedPort port = new ForwardedPortLocal("localhost", 3306, "localhost", 3306);
private static SshClient sshClient = new SshClient(server, 22, username, passwordSsh);

Den Port benötigen wir um später die Daten durch Port 3306 zu tunneln.

 

Die Verbindung ist dann relativ einfach:

if (!sshClient.IsConnected)
{
    sshClient.Connect();

    // offline
    if (sshClient.IsConnected)
    {
        // Start port if not started
        if (!port.IsStarted)
        {
            // Add port if not added yet
            if (!sshClient.ForwardedPorts.Contains(port))
            {
                sshClient.AddForwardedPort(port);
            }
            port.Start();
        }
    }
}

Jetzt schnell noch das Entity Framework (Code First) einbinden und fertig … dachte ich.

Leider kommt mir das alle ziemlich buggy und nicht fertig vor. Drum weiß ich nicht ob ich das wirklich in einer Produktivumgebung einsetzten werde / würde.

Per NuGet gibt es MySql packages … aber welche brauche ich?
Bin selbst noch nicht durchgestiegen was für was ist, kann aber sagen, bei mir hat es nur mit folgenden geklappt:

  <package id="EntityFramework" version="6.1.3" targetFramework="net4" />
  <package id="MySql.Data" version="6.8.7" targetFramework="net4" />
  <package id="MySql.Data.Entities" version="6.8.3.0" targetFramework="net4" />

Nun gibt es aber noch einen Bug der unter einer Mono-Runtime die Version des Servers falsch parsed, somit braucht man folgenden fix (hab es bisl erweitert dass jeder Server/Version richtig gewandelt wird):

using System.Data;
using System.Data.Common;
using System.Data.Entity.Infrastructure;
using System.Text.RegularExpressions;

namespace OpenHop.Database
{
    public class ManifestTokenResolver : IManifestTokenResolver
    {
        public string ResolveManifestToken(DbConnection connection)
        {
            try
            {
                connection.Open();
                string version = OnlyNumbers(connection.ServerVersion);
                return version;

            }
            finally
            {
                if (connection.State == ConnectionState.Open)
                {
                    connection.Close();
                }
            }
        }

        private static readonly Regex digitsOnly = new Regex(@"[^\d]");
        public static string OnlyNumbers(string text)
        {
            return digitsOnly.Replace(text, "");
        }
    }
}

 

In der app.config dann noch die Daten eintragen:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient.EF6" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.3.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d">
      </provider></providers>
  </entityFramework>
  <connectionStrings>
    <add name="MyContext" providerName="MySql.Data.MySqlClient.EF6" connectionString="server=localhost;database=myDatabase;uid=myUsername;pwd=myPassword" />
  </connectionStrings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-6.8.7.0" newVersion="6.8.7.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.data>
    <DbProviderFactories>
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient.EF6" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data, Version=6.8.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    <remove invariant="MySql.Data.MySqlClient" /><add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" /></DbProviderFactories>
  </system.data>
</configuration>
Von |2015-11-02T11:14:25+01:002015-11-02|C#, Mono, Raspberry Pi|

GongSolutions.WPF.DragDrop

Ist gibt immer Technologien welche man nicht mag… denke bei mir ist es Drag & Drop.
Finde es als Bedienkonzept sehr gut, da man hierdurch die User-Experience erhöhen kann.

Aber zum programmieren ist es nicht schön.

GongSolutions.WPF.DragDrop nimmt hier viel Arbeit ab und funktioniert mit primitiven Datentypen sofort.
Kostenlos, frei und auf GitHub zu finden, was will man mehr.

GongSolutions.Wpf.DragDrop.Full

Von |2015-09-25T08:14:03+02:002015-09-26|C#|

WPF: Metro-Design Apps mit MahApps.Metro

Ach, dieses Metro-Design… ich weiß nicht ob man es gut oder schlecht finden sollte. Positiv ist dass es moderner aussieht, aber die Bedienung ist für mich immer noch ungewöhnlich.

Naja, aber es ist eben nun der Windows Standard und man sollte sich schön langsam daran gewöhnen. Auch beim Erstellen von Programmen sollte man dies berücksichtigen.

Durch Zufall bin ich in der aktuellen Ausgabe der DotNetPro über das UI-Framework MahApps.Metro gestolpert.

home-title-light

Es sieht, meiner Meinung nach, super aus und lässt sich sehr schnell und einfach in eine bestehende WPF-Applikation einbinden.
Schön ist auch dass es ein OpenSource-Projekt ist!

Hier mal ein Video-Review von Muhammad Rehan Saeed:

Von |2017-04-18T16:10:29+02:002015-07-02|C#|

Übersetzen / Lokalisierung für C# / WPF

Ach, das mit der Übersetzung ist immer ein Problem, versteh nicht warum. Aber die Aufwände in einer Software/ in der Programmierung was zu übersetzen sind enorm.

Für WPF / C# habe ich eine Möglichkeit gefunden mit der es relativ einfach ist.

Ich verwende das Framework WPFLocalizationExtension. Man muss bisl Hand anlegen, aber wenn die Ressourcedatei mal steht ist es einfach zu pflegen.
Es ist auch möglich aus dem Code heraus, z.B. MessageBox, die Texte zu verwenden.

Um das ganze schön in Excel machen zu können verwende ich das Programm ResXManager. Gibt es als Addin für Visual Studio oder als Stand-Alone-Version.

Danach schön in Excel die Texte eintragen / eintragen lassen und wieder importieren.

Von |2015-06-01T12:41:53+02:002015-06-02|C#|

ErrorList UserControl

Wie im Beitrag zuvor evtl. schon zu erkennen, arbeite ich an einem UserControl für WPF.
Es handelt sich um eine Nachbildung der Fehlerliste (ErrorList) in Visual Studio.

Ich benötige dies bei einem aktuellen Projekt, leider habe ich nichts brauchbares im Netz gefunden. Einzig war dieses Projekt, welches ich auch als Vorlage verwendet habe: http://errorlist.codeplex.com/

Da ich es gerne bereitstellen möchte, habe ich das Steuerelement auch in meiner Freizeit entwickelt, hier hatte ich Gestern (endlich mal wieder) Zeit :^)

ErrorList
Über die Buttons kann die Liste nach dem Meldungstyp gefiltert werden:

ErrorList_Filter

Wie gewohnt sind alles Daten auf GitHub verfügbar.

Ich bin offen für Vorschläge und Kritik, es gibt noch paar Stellen an denen optimiert werden muss… aber erst wenn wieder Zeit ist :^)

Von |2014-07-24T12:58:52+02:002014-07-24|C#|
Nach oben