Um den Datenzugriff innerhalb von Webparts einfach zu gestalten, kann das Entity Framework innerhalb eines SharePoint Projektes genutzt werden. Allerdings gilt es einige “Kleinigkeiten” zu beachten.
Zunächst wird ein “Entity Data Model” zum Projekt hinzugefügt, jedoch kann der Connections-String nicht in der App.Config gespeichert werden.
Hürde 1
das EF Assembly wird vom SharePoint Server nicht geladen, da diese nicht als SafeControl eingetragen ist. Um einen SafeControl Eintrag zu setzen, muss das Package-Manifest bearbeitet werden.
In der Karteikarte “Advanced” kann mit “add” ein Assembly eingetragen werden.
Hürde 2
Bis zum EF 4 konnte bei der Initialisierung des Context ein Connection String angegeben werden. EF 5 bietet diesen Konstruktor nicht mehr. Die Context Klasse ist jedoch als partial Class definiert, daher kann ein eigener Konstruktor, der einen Connections String übergeben bekommt definiert werden. In das Projekt ist eine weitere Klasse aufzunehmen, die folgenden Code enthält:
1: public partial class Entities : DbContext
2: {
3: public Entities(string ConnectionString)
4: : base(ConnectionString)
5: {
6: }
7: }
Nachdem die Klasse geschrieben ist, kann der Connection String formuliert werden. Wichtig ist, dass der vollständige, für das EF formulierte Connection String verwendet wird. Sollte nur ein “simpler” SQL Server Connection String verwendet werden, kann es zu einer UnintentionalCodeFirstException kommen. Der Connection String kann aus dem “Update Model from Database”-Dialog kopiert werden. Die im Connection String verwendeten doppelten Hochkomma können durch einfache Hochkomma ersetzt werden.
Im Connection String muss noch die User Information angepasst werden. Im Code BSP wird diese Information hardcoded im Source Code abgelegt. Eine Erklärung wie die Credentials im Secure Store Service abgelegt und wieder abgefragt werden können ist hier zu finden.
Der Code für die Datenabfrage sieht nun so aus:
1: string co = @"
2: metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
3: provider=System.Data.SqlClient;
4: provider connection string='data source=server1;
5: initial catalog=Northwind;
6: user Id=sa;
7: password=ppedvAG
8: MultipleActiveResultSets=True;
9: App=EntityFramework'
10: ";
11:
12: Entities ctx = new Entities(co);
13:
14: var erg = from c in ctx.Customers
15: select c;