Der normale Weg für ein Datenbankdesign, zumindest der, den viele Entwickler gehen, ist für eine Tabelle einen Primärschlüssel (PK) zu setzen. Dabei ist der Datentyp der “Id” Spalte meistens ein Integer (int). Dieser wird dann, meistens automatisch von der Datenbank, inkrementiert, damit er eindeutig bleibt. Doch im Zeitalter von mobilen Anwendungen ist es sinnvoller einen Datentyp zu verwenden, der nicht nur lokal bei einer Datenbank eindeutig ist, sondern auch über Datenbanken und Netze hinweg, z.B. auf dem Mobiltelefon oder einer anderen Datenbank. Für diesen Fall ist beim Microsoft SQL Server 2005/2008 der uniqueidentifier vorgesehen. Unter .NET kennt man diesen Datentypen auch als Guid. Dieser Datentyp hat den Vorteil, dass er immer eindeutig bleibt.

Dieser Weg blieb mit dem Entity Framework bislang verwehrt, wollte man die GUIDs vom Server generieren lassen. Es ist jetzt jedoch sehr wohl möglich, seit Version 4 des Entity Frameworks werden servergenerierte GUID-Typidentitätswerte unterstützt. Alle anderen Aussagen in Blogs und Forenbeiträgen unserer Internationalen Entwicklerkollegen diesbezüglich, die ich finden konnte, verweisen leider fälschlicher Weise auf eine veraltete MSDN Seite für Version 1 des EF.

Auf der aktuellen und handübersetzen MSDN Seite wird es jedoch explizit benannt, trotzdem fehlt es an einer genauen Beschreibung, wie man vorgehen muss.

 

Da ich selbst immer wieder auf Hindernisse gestoßen bin, dieses Konzept mit dem Entity Framework zu benutzen, jetzt ein klare, direkte Anleitung, wie es garantiert funktioniert.

Durchgeführt mit dem Visual Studio 2010 RTM + Silverlight 4 Tools RC2, SQLServer 2008. Funktionierenden Einsatz findet die Technik in einer Silverlight 4 Business Anwendung mit RIA Services

Am SQL-Server 2008:

  1. Tabelle mit einer Spalte, z.B. “Id”, vom Datentyp uniqueidentifier erstellen.
  2. Defaultwert der Spalte auf newid() setzen.
  3. “Id” Spalte als Primary Key setzen.

In Visual Studio 2010:

  1. Datenbank-Model für EF erzeugen.
  2. T4 Templates erstellen mit Rechtsklick ins Design “Add Codegeneration Item”.
  3. Tabellen-Entity auswählen und StoreGeneratedPattern beim Id-Property auf Identity stellen.
  4. Speichern.

Unter besten Bedingungen sollte es jetzt klappen. Leider nicht bei mir, und bei vielen anderen auch nicht. Den eigentlichen Fehler zu finden hat mich sehr viel Zeit gekostet. Er liegt im Entity Framework Designer. Es handelt sich um einen Bug beim setzen der Entityproperty-Eigenschaft StoreGeneratedPattern. Nähere Infos zum Bug sowie ein netten Kommentar eines Linq-To-Sql Fans über EF sowie der Namensgabe der Eigenschaft findet man hier.
Um den Bug zu fixen fehlt noch der wichtigste Schritt:


Der wichtigste Schritt:

  1. Den EF-Designer schließen und die edmx-Datei mit dem XML-Editor öffnen (Rechtsklick auf die Datei –> “Open with..”)
  2. Im StorageModel kontrollieren und wahrscheinlich nachtragen:

<EntityType Name="TestTabelle">
          <Key>
            <PropertyRef Name="Id" />
          </Key>
          <Property Name="Id" Type="uniqueidentifier" Nullable="false" StoreGeneratedPattern="Identity"/>
          <Property Name="Test" Type="varchar" MaxLength="50" />
</EntityType>

Jetzt sollte alles bestens funktionieren. Das selbe Prinzip ist auch bei Spalten wie z.B. “DateCreated” mit einem datetime Datentyp und einer getdate() Methode anwendbar. Einfach StoreGeneratedPattern = Identity setzen und im StorageModel, wenn nicht vorhanden, so wie oben nachtragen.

Bitte beachten, das bei Updates vom Designer diese Werte überschrieben werden können.

 

Der Vollständigkeit halber, einige Fehlermeldungen, mit denen ich in diesem Zusammenhang zutun hatte, damit Leute mit ähnlichen Problem diesen Beitrag schneller finden können:

[System.Data.SqlClient.SqlException] = {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}


 
Categories: .NET | Entity Framework

Mit Silverlight 4 ist es relativ leicht möglich OOB-Anwendungen bzw. Silverlight 4 Businessanwendungen zu entwickeln. Die Installation ist dabei kinderleicht. Ein Rechtsklick auf die Silverlight 4 Anwendung genügt, und schon steht ein Kontextmenüeintrag zur Installation bereit. Danach erscheint ein Dialog den der User bestätigen muss, um die Anwendung zu Installieren. Im Dialog kann der User selbst wählen, ob er Die Anwendung als Desktop-Icon oder Startmenü-Eintrag oder beides installieren möchte.

Nach der Bestätigung zur Installation folgt weder ein weiterer Setupdialog noch irgendeine Form von Prozentbalken, die eine Installation vermuten lässt. Die Anwendung ist einfach innerhalb von Sekunden sofort einsatzbereit. – Installieren war noch nie leichter. So werden nützliche Silverlight 4 Anwendung schnell lokal und auch offline verfügbar gemacht.

Doch was, wenn eine neue Version der Anwendung im Netz erscheint?

Die Antwort liegt auf der Hand: Automatische Updates. Und das geht wie folgt:

Silverlight 4 kommt bereits mit einer vollwertigen Update-Routine, die nur noch aufgerufen werden will. Dies erledigt man z.B. beim Starten der Applikation.

Dazu brauchen wir in die App.xaml.cs nur folgenden Codeschnipsel einfügen:

  public App()
        {
            InitializeComponent();

            if (Application.Current.IsRunningOutOfBrowser)
                {
                    App.Current.CheckAndDownloadUpdateCompleted += 
                        new CheckAndDownloadUpdateCompletedEventHandler(CheckAndDownloadUpdateCompleted);
                    App.Current.CheckAndDownloadUpdateAsync();
                
                }
        }

        void CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e)
        {
            if (e.Error == null && e.UpdateAvailable)
            {
                MessageBox.Show("Die Anwendung wurde aktualisiert. Bitte starten Sie die Anwendung neu.");
            }
            else
            {
                if(e.Error != null)
                    MessageBox.Show(e.Error.ToString() + “.:“ + e.Error.Message);
            }
        }

Die Methode CheckAndDownloadUpdateAsync(); prüft auf ein Update der Anwendung. Bei Vorhandensein eines Updates wird dieses geladen. Das Ergebnis wird in einem Callback-Event void CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e)  zurückgegeben, den wir vorher registriert haben. Diesen können wir auswerten und entsprechend darauf reagieren. Zum Beispiel den Benutzer auffordern, die Anwendung nach einem Update neu zu starten oder einen Fehler, sofern einer aufgetreten ist, auszugeben.

Um die Funktionalität zu testen, braucht man nur eine OOB Anwendung erstellen und anschließend zu installieren. Danach genügt eine Änderung, die kompiliert werden muss, sodass es ein vermeidliches Update der Anwendung gibt. Nach erneutem Starten der Anwendung vom Startmenü erscheint die oben programmierte Updatemeldung. – So leicht kann es gehen….

Doch das ist leider nur die halbe Wahrheit. – Zum Glück!

image

Leider funktioniert der oben beschriebene Weg nur auf dem eigenem PC, und nicht auf anderen im Netzwerk und schon gar nicht im Internet. Das ist auch gut so, da jede Aktualisierung einer Anwendung auch ein potenzielles Sicherheitsrisiko ist.

Um das Problem zu lösen, müssen wir unsere Silverlight 4 OOB-Anwendung erst mit einem gültigen Zertifikat signieren. Es ist sowieso sinnvoller OOB Anwendungen zu signieren, da dem Benutzer zusätzlich der normalerweise abschreckende Bestätigungsdialog erspart bleibt. Stattdessen erscheint ein eher vertrauenserweckender Dialog mit Informationen zum Herausgeber der Anwendung, etc.

So signiert man eine Silverlight Anwendung:

  1. Man benötigt einen private key mit Zertifikat (.pfx ) zum signieren der Anwendung. Diesen kann man zum einen bei Zertifizierungsstellen erwerben, oder selbst erstellen (SPC). Bei einem selbsterstellten Zertifikat muss man diesem jedoch erst sein Vertrauen schenken. Eine Anleitung dazu und der Erstellung gibt es hier: http://stackoverflow.com/questions/84847/how-do-i-create-a-self-signed-certificate-for-code-signing-on-windows oder findet man an vielen Stellen im Netz, z.B. mit OpenSSL.
  2. Im Postbuild-Event des Silverlight 4 Projekts muss folgender Befehl eingefügt werden:
       "%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\Bin\signtool.exe" sign /v /f c:\path\to\mykey.pfx /p "MYPASSWORD" /t TIMESTAMP_URI_FROM_PROVIDER $(TargetName).xap


Nach dem Kompilieren sollte nun ein vertrauenswürdiger Dialog erscheinen, wenn man die Anwendung installieren will. Das Update funktioniert jetzt auch auf anderen Clients, die dem Zertifikat vertrauen.
Wichtig ist jedoch, dass dieser Schritt vor dem ersten Ausrollen der Anwendung geschehen muss. Und nicht erst danach! Sonst steht kein automatisches Updatefeature mehr zur Verfügung.


 
Categories: Silverlight

Gestern ging die Silverlight 4 Release Version, wie am Dienstag dem 13.04.2010 angekündigt, live. Zudem wurde einen Tag vorher die Visual Studio 2010 RTM Version released.

Laut Tim Heuer benötigen die Silverlight 4 Tools Entwickler, die die Werkzeuge in Visual Studio zu Bearbeitung von Silverlight 4  Anwendungen entwickeln, erst die Silverlight 4 Release Version, um selbst das Final Release fertigstellen zu können.

“To be clear, Silverlight 4 has released.  This is RTW (release to web).  It is the version 4 of Silverlight.  Shipped.  Done.  Finished.

The tools (namely SL4 tools, RIA Services and Blend) are in their ‘release candidate’ mode.  I’ll spare you the gory details, but remember that these tools teams need SL4 to be *done* before they can be done.  SL4 is a dependency for them.  These tools are release quality though and I’d recommend using them.  Their final versions will come soon enough and will be a minor update.”

 

Zuerst dachte ich:

“Na toll! Noch länger mit der Visual Studio 2010 RC Version ausharren.“

Aber weit gefehlt:

Es wurden bereits die Silverlight 4 Tools RC2 veröffentlicht.

Laut der Downloadseite bei Microsoft wird folgendes Unterstützt.

“This package is an add-on for Visual Studio 2010 to provide tooling for Microsoft Silverlight 4 and RIA Services. It can be installed on top of either Visual Studio 2010 or Visual Web Developer 2010 Express. It extends existing Silverlight 3 features and multitargeting capabilities in Visual Studio 2010 to also create applications for Silverlight 4 using C# or Visual Basic. Note that this is a second Release Candidate (RC2) for the tools; the final release will be announced in the coming weeks.
Silverlight 4 Tools for Visual Studio 2010 includes several features:

  • Support for targeting Silverlight 4 in the Silverlight designer and project system
  • RIA Services application templates and libraries
  • Support for Silverlight 4 elevated trust and out-of-browser applications and other new Silverlight 4 features

This download will install all components necessary for Silverlight 4 and RIA Services development:
  • Silverlight 4 developer runtime (final release)
  • Silverlight 4 SDK (software development kit, final release)
  • Update for Visual Studio 2010 and Visual Web Developer Express 2010 (KB976272, pre-release)
  • Silverlight 4 Tools for Visual Studio 2010 RC2
  • WCF RIA Services for Silverlight 4 RC2

The final release of Silverlight 4 Tools will be made available in the near future.”

 
Categories: .NET | Silverlight

April 9, 2010
@ 05:28 PM
Pixels

Das Video muss man einfach gesehen haben! Genial!