Mein Ziel in diesem Tutorial ist es, das neue ASP.Net 5 oder ASP MVC 6 mit dem Entity Framework 7 auszustatten. Dazu soll eine Tabelle Personal mit einer Adresstabelle in einer n:m Beziehung stehen. Na dann… lets go.
- Projekt erstellen
Unter Web finden wir in Visual Studio 2015 den Eintrag ASP.NET Web Application
Es ist egal, ob wir ein leeres Projekt, die Web API oder Web Application wählen. Dies sind nur die Vorlagen. Wichtig ist nur, einen aus den unteren ASP.NET 5 Templates zu wählen
Ich habe meine Klassen gerne kategorisiert und daher lege ich für die Datenbank Modelle einen Ordner dbModels an.
2. Entity Framework 7 installieren und Klassen anlegen
a) Entity Framework installieren
mit Alt + T + N + O rufen wir die Nuget Console auf und geben dort folgendes ein um die neuste EF7 zu installieren:
1 |
Install-Package EntityFramework.MicrosoftSqlServer –Pre |
und dann noch die Commands:
1 |
Install-Package EntityFramework.Commands –Pre |
Da das ganze noch in den Kinderschuhen ist, hat bei mir in der project.json Datei die Abhängigkeit zu den Commands gefehlt. Diese muss man evtl. manuell nachbessern. Dazu in der project.json Datei
1 2 3 |
"commands": { "web": "Microsoft.AspNet.Server.Kestrel", }, |
mit
1 2 3 4 |
"commands": { "web": "Microsoft.AspNet.Server.Kestrel", "ef": "EntityFramework.Commands" }, |
ersetzen. Und gleichzeitig einen Blick drauf werden, ob unter dependencies EF und Commands richtig instelliert sind:
1 2 3 |
"dependencies": { "EntityFramework.Commands": "7.0.0-rc1-final", "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final", |
Falls man eine Änderung vornehmen musste, Project speichern, schließen und als Administrator neu aufmachen.
b) Code First Modell erstellen
Jetzt kann man das Abbild der Datenbank, das Modell der Personen Tabelle als Klasse in den neu angelegten Ordner erstellen:
1 2 3 4 5 6 7 8 9 10 |
// Key = Es ist der Primärschlüssel, DatabaseGeneratedOption = Die Identität wird nicht automatisch gesetzt [Key] [DatabaseGenerated(DatabaseGeneratedOption.None)] public class Personal { public int PersNr { get; set; } public string FirstName { get; set; } public string LastName { get; set; } } |
wobei die PersNr später der PrimaryKey sein wird. Heißt eine Property Id, dann erkennt Entity Framework diese automatisch als PrimaryKey an.
c) dbContext Klasse erstellen
Auch EF7 arbeitet mit einer Klasse, die von DbContext erbt. Hier legen wir Grundlegende Eigenschaften zur Verbindung und den Modellen an. Ich habe diese Klasse ebenfalls in den dbModels Ordner gelegt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class db : DbContext { public void Createdb() { Database.Migrate(); } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Data Source='KINGSIDE\KINGSIDE'; initial Catalog=Time;User ID=sa;password=123456;"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<dbModels.Personal>().ToTable("Personal", "Personal"); modelBuilder.Entity<dbModels.Address>().ToTable("Address", "Personal"); } public DbSet<Personal> Personal { get; set; } public DbSet<Address> Address { get; set; } } |
Der 1.Teil mit dem Konstruktor ist da, der sagt, wenn die Datenbank nicht vorhanden ist, so soll doch bitte eine erstellt werden.
Der 2. Teil OnConfiguring: Hier gebe ich den Datenbankpfad an.
Der 3. Teil von OnModelCreating, hier kann ich unter anderem den Tabellennamen und den Namen des Schemas wählen. Ich habe das gerne, dass zusammenhängende Tabellen einen gemeinsamen Namen bekommen. Per Standard heißt das Schema immer dbo.
Der 4. Teil ist eine Property der dbContext Klasse vom Typ DbSet, damit wir über diese später Daten lesen,einfügen,ändern und löschen können.
d) Migration erstellen
Nun ist es an der Zeit eine Datenbankverbindung zu testen und gleichzeitig eine erste Migration zu erstellen.
Dazu öffnen wir wieder die NuGet Console.
Da wir mit ASP.Net 5 arbeiten, gelten für uns nicht die alten Entity Framework Befehle, sondern die von DNX. Diese verlang von uns, dass wir die Befehle dort ausführen, wo sich die Datei befindet. Die EF Dateien befinden sich in der Ordnerstruktur src/[Projektname].
Navigieren kann man mit cd Ordnername nach vorne bzw. cd ..\ einen Satz zurück. Mit dir bekommt man eine Übersicht.
Konkret muss man in den Ordner src\ProjektName wechseln
Nun gibt man dort folgendes ein:
1 |
dnx ef migrations add MyMigration |
Dann sollte man auch ein Done. Als Bestätigung bekommen. Weiterhin sieht man nun einen Ordner Migrations und in der Datenbank ist die Datenbank angelegt worden mit der Tabelle Personal
3. Klasse Adresse erstellen, welche eine Beziehung zu der Klasse Personal hat
Jetzt erstellen wir eine weitere Klasse Adress
Eine Adresse kann nur einer Person gehören. Daher bekommt jede Adresse nur eine Person zugewiesen. Gäbe es einen Fall, wo die Beziehungsklasse mehrere Personen enthalten kann, so würde man dies in eine ICollection<Person> packen.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Address { [Key] public long Id { get; set; } [Required] public Personal Personal { get; set; } public string Street { get; set; } public string CityCode { get; set; } public string City { get; set; } public string Region { get; set; } public string Country { get; set; } } |
4. Default Connection String
Im Punkt 2c) haben wir einen Connection String direkt eingetragen. Will man das Projekt eines Tages publizieren, könnte man ihn so nicht ändern. Deshalb müssen wir diesen Connection String auslagern. Dazu erstellt man eine neue config.json Datei mit der Vorlage von ASP.NET Configuration File
und schreibt dort den Connection String rein.
Weiter muss nun auch die startup.cs angepasst werden:
- Property erstellen:
1public static IConfiguration ConfigurationSql { get; set; } - Den Konstruktor anpassen:
12345678910111213141516public Startup(IHostingEnvironment env){// Set up configuration sources.var builder = new ConfigurationBuilder().AddJsonFile("appsettings.json");if (env.IsEnvironment("Development")){// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.builder.AddApplicationInsightsSettings(developerMode: true);}builder.AddEnvironmentVariables();Configuration = builder.Build().ReloadOnChanged("appsettings.json");ConfigurationSql = new ConfigurationBuilder().AddJsonFile("config.json").Build();}
- die alte Context Klasse anpassen:
1234protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseSqlServer(Startup.ConfigurationSql["Data:DefaultConnection:ConnectionString"]);}
- Damit die Datenbank erstellt und aktuallisiert werden kann, fügen wir noch folgendes ein:
123456789101112131415public void ConfigureServices(IServiceCollection services){//Add Entity Frameworkservices.AddEntityFramework().AddSqlServer().AddDbContext<dbModels.db>();// Erstelle und aktuallisiere Datenbank, wenn Seite gestartet wirdusing (var db = new dbModels.db()){db.Createdb();}// Add framework services.services.AddApplicationInsightsTelemetry(Configuration);services.AddMvc();}
Login