Fragensteller
Aus der MSDN-Hotline: Wie kann ich einen MySQL-Server mit dem Entity Framework verweden?

Allgemeine Diskussion
-
Hallo zusammen,
heute wurde uns bei der MSDN-Entwickler-Hotline unter anderem folgende Frage gestellt:Wie kann ich einen MySQL-Server mit dem Entity Framework verweden?
Unsere Antwort bzw. unser Lösungsvorschlag darauf war:Zuerst muss die Abhängigkeit "MySql.Data.Entity" mit NuGet dem Projekt hinzugefügt werden.
Danach müssen die folgendem Zeilen in der App.config geändert beziehungsweise hinzugefügt werden:
<connectionStrings> <add name="[contextname]" providerName="MySql.Data.MySqlClient" connectionString="server=[serveraddress]; port=[serverport];database=[databasename];uid=[username];password=[password]"/> </connectionStrings> <entityFramework> <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> <providers> <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6" /> <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" /> </providers> </entityFramework>
[contextname] steht hierbei für den Namen unter dem das Entity Framework diesen Connection-String finden kann.
Ich erkläre die Verwendung des Entity Frameworks mit einem Code-Beispiel:
Wichtig für dieses Beispiel sind die Tabellen, die vom Entity Framework als Objekte bereitgestellt werden sollen.Für dieses Beispiel verwende ich eine einfache Datenbank mit zwei Tabellen. eine für "Mitarbeiter" und eine für "Teams".
Ein Mitarbeiter("employee") hat eine Mittarbeiternummer("id"), einen Vornamen("firstname"), einen Nachnamen("lastname") und ein Team dem er angehören kann. Ein Team hat einen Teamnummer("id") und einen Namen("name").Diese Tabellen muss man bevor man sie verweden kann erstellen.
Die oben beschriebenen Tabellen werden durch folgenden SQL-Code erstellt:
CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `firstname` varchar(45) NOT NULL, `lastname` varchar(45) NOT NULL, `team` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `teams` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
Damit das Entity Framework weis, wie es Objekte auf diese Tabellen abblilden soll müssen die Klassen Employee und Team implementiert werden. Um sicher zu stellen, dass die Tabellen richtig als Objekte interpretiert werden können sollte man Anmerkungen/Annotations für das Entity Framework verwenden. [Key] weist beispielsweise auf den Primärschlüssel (primary key) hin. Weitere Informationen zu den Annotations sind unter [2] zu finden.
[Table("employees")] public class Employee { [Key] public int id { get; set; } [Required] public string firstname { get; set; } [Required] public string lastname { get; set; } public int team { get; set; } }
[Table("teams")] public class Team { [Key] public int id { get; set; } [Required] public string name { get; set; } }
Außerdem muss dem Entity Framework klar sein auf welche Datenbank es zugreifen soll und welche Objekte es daraus generieren soll:
[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class MyDBContext : DbContext { public MyDBContext() : this("EF_Test_Context") { } public MyDBContext(string connStringName) : base(connStringName) { } static MyDBContext() { DbConfiguration.SetConfiguration(new MySql.Data.Entity.MySqlEFConfiguration()); } public DbSet<Employee> Employees { get; set; } public DbSet<Team> Teams { get; set; } }
An der Stelle, an der ich "EF_Test_Context" sollte der Wert [contextname] aus der App.config stehen.
Ab diesem Punkt stehen die Daten der Tabellen Employees und Teams durch das Entity Framework als Objekte zur Verfügung.
Diese können mit Queries wie gewohnt verwendet werden.
Folgender Code listet alle Mitglieder des Teams "administration" auf:
string teamname = "administration"; var db = new MyDBContext(); Team team = (from t in db.Teams where t.name == teamname select t).First(); Console.WriteLine("selecting members of team {0}({1})", team.id, team.name); var employees = from e in db.Employees where e.team == team.id select e; foreach (Employee e in employees) { Console.WriteLine("{0} {1} is member of the {2} team", e.firstname, e.lastname, team.name); }
[1] Erste Schritte mit Entity Framework (EF)
[2] Code First DataAnnotations
Wir hoffen, vielen Besuchern der MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.
Viele Grüße,
J. Oldoerp
Entwickler-Hotline für MSDN Online Deutschland
Disclaimer:
Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN-Entwickler-Hotline: http://www.msdn-online.de/Hotline
Es gelten für die MSDN-Entwickler-Hotline und dieses Posting diese Nutzungsbedingungen , Hinweise zu Markenzeichen, Informationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN-Entwickler-Hotline .
- Bearbeitet J. Oldoerp Montag, 27. April 2015 19:29