EF Core – So erstellen Sie eine Datenbank und eine Tabelle

EF Core – So erstellen Sie eine Datenbank und eine Tabelle

In diesem Artikel zeige ich, wie Sie mit EF Core eine Datenbank mit einer darin enthaltenen Tabelle erstellen. Am Ende zeige ich eine eigenständige Konsolen-App, die einen Datensatz in diese Datenbank einfügt.

Hinweis:Ich verwende SQL Server. Mit anderen Datenbankanbietern habe ich das noch nicht probiert. Bitte hinterlassen Sie einen Kommentar, wenn Sie einen anderen Datenbankanbieter verwenden, und teilen Sie mir mit, wie es gelaufen ist.

Fügen Sie die EF Core-Nuget-Pakete und -Tools hinzu

Installieren Sie die EF Core-Nuget-Pakete

Der erste Schritt besteht darin, die EF Core-Nuget-Pakete zu installieren.

Führen Sie Folgendes in der Paket-Manager-Konsole aus (Ansicht> Andere Fenster> Paket-Manager-Konsole).

Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Design
Code language: PowerShell (powershell)

Hinweis:Wenn Sie SQL Server nicht verwenden, müssen Sie das entsprechende Nuget-Paket für Ihren Datenbankanbieter erwerben.

Dadurch werden die Paketreferenzen wie folgt zu Ihrer csproj-Datei hinzugefügt:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>ef_core_cli</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.4">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.4" />
  </ItemGroup>

</Project>

Code language: HTML, XML (xml)

Installieren Sie das dotnet ef-Tool

Das Tool dotnet ef wird verwendet, um die Datenbank zu installieren und zu aktualisieren.

Installieren Sie das Tool, indem Sie Folgendes in der Befehlszeile ausführen:

dotnet tool install --global dotnet-ef
Code language: PowerShell (powershell)

Modell hinzufügen

Ein Modell ist eine Klasse, die eine Tabelle in der Datenbank darstellt. Jede Eigenschaft ist eine Spalte in der Tabelle. Sie können Datenanmerkungsattribute verwenden, um zu definieren, wie jede Spalte erstellt werden soll.

Wenn Sie EF Core zum Erstellen der Datenbank verwenden, werden die Modellklassen zum Erstellen der Tabellen verwendet.

Hier ist der Film Modell Klasse. Dies wird verwendet, um die Filme zu erstellen Tabelle.

using System.ComponentModel.DataAnnotations;

public class Movie
{
	[Key]
	public int Id { get; set; }

	[Required]
	[MaxLength(500)]
	public string Name { get; set; }

	[Required]
	public int ReleaseYear { get; set; }

	[Required]
	[MaxLength(500)]
	public string Description { get; set; }

	[Required]
	public int RuntimeMinutes { get; set; }
}
Code language: C# (cs)

Datenanmerkungen

Der Film model verwendet Datenanmerkungsattribute, um anzugeben, wie die Tabelle erstellt werden soll. Es sind weitere Datenanmerkungen verfügbar, aber ich erkläre nur die drei, die im Film verwendet werden Modell:

Anmerkung Was bedeutet das? Beispiel
Schlüssel Die Spalte ist der Primärschlüssel. [Schlüssel]
public int Id { get; einstellen; }

Erzeugt Spalte:
Id (PK, int, not null)
Erforderlich Die Spalte ist nicht nullable. [Erforderlich]
public int ReleaseYear { get; einstellen; }

Erzeugt Spalte:
ReleaseYear (int, not null)
MaxLänge Die Spaltenfeldgröße.

Wenn Sie dies nicht angeben, haben Zeichenfolgenfelder die Feldgröße MAX.
[Erforderlich]
[MaxLength(500)]
öffentliche Zeichenfolge Name { get; einstellen; }

Erzeugt Spalte:
Name (nvarchar(500), not null)

Fügen Sie Ihre eigene DbContext-Klasse hinzu

Beim Erstellen der Datenbank verwendet EF Core die Informationen in Ihrer DbContext-Klasse, um zu bestimmen, wie die Datenbank erstellt wird.

Also Unterklasse DbContext und:

  • OnConfiguring überschreiben und eine Verbindungszeichenfolge übergeben.
  • Fügen Sie für jedes Modell eine DbSet-Eigenschaft hinzu.
using Microsoft.EntityFrameworkCore;

public class StreamingServiceContext : DbContext
{

	private readonly string ConnectionString;
	public StreamingServiceContext(string connectionString)
	{
		ConnectionString = connectionString;
	}
	protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
	{
		optionsBuilder.UseSqlServer(ConnectionString);
	}

	public DbSet<Movie> Movies { get; set; }
}
Code language: C# (cs)

Optional – Fügen Sie Ihren ConnectionString einer Konfigurationsdatei hinzu

Sie müssen Ihre Verbindungszeichenfolge irgendwo haben . Ich werde zeigen, wie man es zu appsettings.json hinzufügt und es dann mit Benutzergeheimnissen überschreibt. Dieser Schritt ist optional, da Sie die Verbindungszeichenfolge möglicherweise anders handhaben möchten.

appsettings.json hinzufügen

  • Fügen Sie eine neue Datei namens appsettings.json hinzu.
  • Stellen Sie es auf Kopieren, wenn neuer .
  • Fügen Sie dort den ConnectionStrings-Abschnitt ein. Ich lasse es absichtlich leer. Die tatsächliche Verbindungszeichenfolge wird in der Benutzergeheimnisdatei angegeben.
{
  "ConnectionStrings": {
    "Default": "<left blank>"
  }
}
Code language: JSON / JSON with Comments (json)

Ihr csproj sollte nun so aussehen:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>ef_core_cli</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.4">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.4" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

Code language: HTML, XML (xml)

Fügen Sie die Benutzergeheimnisse hinzu und überschreiben Sie die Verbindungszeichenfolge

  • Führen Sie Folgendes in der Paket-Manager-Konsole aus (Ansicht> Andere Fenster> Paket-Manager-Konsole).
Install-Package Microsoft.Extensions.Configuration.UserSecrets
Code language: PowerShell (powershell)

Hinweis:Das UserSecrets-Paket enthält bereits Microsoft.Extensions.Configuration.Json, sodass Sie es nicht separat hinzufügen müssen.

  • Klicken Sie mit der rechten Maustaste auf das Projekt> klicken Sie auf Benutzergeheimnisse verwalten .
  • Dadurch wird die Datei secrets.json erstellt und geöffnet.
  • Jetzt können Sie die Verbindungszeichenfolge von appsettings überschreiben, indem Sie sie in secrets.json einfügen:
{
  "ConnectionStrings": {
    "Default": "Server=SQL_SERVER_INSTANCE_NAME;Database=StreamingService;Integrated Security=true"
  }
}
Code language: JSON / JSON with Comments (json)

Ihre csproj-Datei sollte nun die Benutzergeheimnisse enthalten:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <RootNamespace>ef_core_cli</RootNamespace>
    <UserSecretsId>9bc52419-f971-411a-91e7-47ecdfb428da</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.4">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.4" />
    <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="5.0.0" />
  </ItemGroup>

  <ItemGroup>
    <None Update="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

Code language: HTML, XML (xml)

Rufen Sie die Verbindungszeichenfolge mit ConfigurationBuilder ab

Verwenden Sie jetzt ConfigurationBuilder, um die Verbindungszeichenfolge abzurufen:

using Microsoft.Extensions.Configuration;

class Program
{
	static void Main(string[] args)
	{
		var config = new ConfigurationBuilder()
			.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
			.AddJsonFile("appsettings.json")
			.AddUserSecrets<Program>()
			.Build();


		var connectionString = config.GetConnectionString("Default");

		Console.WriteLine(connectionString);
	}
}
Code language: C# (cs)

Führen Sie den Code aus. Es sollte die Verbindungszeichenfolge aus der Benutzergeheimnisdatei ausgeben:

Server=SQL_SERVER_INSTANCE_NAME;Database=StreamingService;Integrated Security=trueCode language: plaintext (plaintext)

Hinweis:Wenn die Verbindungszeichenfolge in secrets.json nicht überschrieben wird, wird stattdessen die Verbindungszeichenfolge aus appsettings.json gezogen.

Datenbank erstellen

Nachdem Sie nun den DbContext, ein Modell und eine Möglichkeit zum Abrufen der Verbindungszeichenfolge haben, können Sie dotnet ef verwenden, um die Datenbank tatsächlich zu erstellen.

Dies ist ein zweistufiger Prozess. Zuerst erstellen Sie eine Datenbank „Migration“ und wenden sie dann an. Dies wird sinnvoller, wenn Sie die folgenden Schritte ausführen.

Hinzufügen einer Kontextfactory zur Entwurfszeit

Wenn Sie dotnet ef zum Erstellen der Migration verwenden, wird nach einer parameterlosen DbContext-Klasse gesucht. Wenn dies nicht vorhanden ist, wird nach einer Implementierung von IDesignTimeDbContextFactory gesucht. Danach wird es immer komplizierter.

Die einfachste Lösung ist die Implementierung von IDesignTimeDbContextFactory. Dadurch haben Sie die volle Kontrolle darüber, welches Kontextobjekt dotnet ef verwendet, wenn es Migrationen erstellt.

using Microsoft.EntityFrameworkCore.Design;
using Microsoft.Extensions.Configuration;

public class DesignTimeContextFactory : IDesignTimeDbContextFactory<StreamingServiceContext>
{
	public StreamingServiceContext CreateDbContext(string[] args)
	{
		var config = new ConfigurationBuilder()
			.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
			.AddJsonFile("appsettings.json")
			.AddUserSecrets<Program>()
			.Build();


		var connectionString = config.GetConnectionString("Default");

		return new StreamingServiceContext(connectionString);
	}
}
Code language: C# (cs)

Datenbankmigration erstellen

Um eine Datenbankmigration zu erstellen, führen Sie den folgenden Befehl aus (aus dem Projektverzeichnis):

dotnet ef migrations add Database_v0
Code language: PowerShell (powershell)

Dadurch wird Ihrem Projekt ein /Migrations/-Ordner hinzugefügt und drei Migrationsquelldateien erstellt:

  • 20210314124406_Database_v0.cs
  • 20210314124406_Database_v0.Designer.cs
  • StreamingServiceContextModelSnapshot.cs

Hinweis:dotnet ef erstellt die Migrationsdateien mit einem Zeitstempel im Namen.

Diese Migrationsdateien enthalten die Logik zum Erstellen der Datenbank. Sehen Sie sich 20210314124406_Database_v0.cs an:

public partial class Database_v0 : Migration
{
	protected override void Up(MigrationBuilder migrationBuilder)
	{
		migrationBuilder.CreateTable(
			name: "Movies",
			columns: table => new
			{
				Id = table.Column<int>(type: "int", nullable: false)
					.Annotation("SqlServer:Identity", "1, 1"),
				Name = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false),
				ReleaseYear = table.Column<int>(type: "int", nullable: false),
				Description = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false),
				RuntimeMinutes = table.Column<int>(type: "int", nullable: false)
			},
			constraints: table =>
			{
				table.PrimaryKey("PK_Movies", x => x.Id);
			});
	}

	protected override void Down(MigrationBuilder migrationBuilder)
	{
		migrationBuilder.DropTable(
			name: "Movies");
	}
}
Code language: C# (cs)

Wenden Sie die Datenbankmigration an, um die Datenbank zu erstellen

Angenommen, Sie befinden sich in einer Entwicklungsumgebung, gibt es zwei Optionen zum Anwenden der Migration:Verwenden Sie dotnet ef oder verwenden Sie context.Database.Migrate().

Hinweis:Die Erörterung von Produktionsbereitstellungsstrategien geht über den Rahmen dieses Artikels hinaus.

Option 1 – Wenden Sie die Migration mit dotnet ef an

Um die neueste Migration anzuwenden, führen Sie Folgendes aus (aus dem Projektverzeichnis):

dotnet ef database update
Code language: PowerShell (powershell)

Wenn Ihre Datenbank nicht vorhanden ist, wird sie erstellt und dann die neueste Migration angewendet. Sie können auch angeben, welche Migration verwendet werden soll.

Diese Option funktioniert, wenn Sie sich in einer Entwicklungsumgebung befinden und das Projektverzeichnis verfügbar haben.

Option 2 – Migration aus dem Code anwenden

Sie können context.Database.Migrate() aufrufen und es wird die neueste Migration anwenden. Wenn Ihre Datenbank nicht existiert, wird sie erstellt.

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

class Program
{
	static void Main(string[] args)
	{
		var config = new ConfigurationBuilder()
			.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
			.AddJsonFile("appsettings.json")
			.AddUserSecrets<Program>()
			.Build();


		using (var context = new StreamingServiceContext(config.GetConnectionString("Default")))
		{
			context.Database.Migrate();
		}
	}
}
Code language: C# (cs)

Verwenden Sie die Datenbank

Nachdem Sie die Datenbank erstellt haben, können Sie sie verwenden.

Wenn Sie mit der Verwendung von EF Core zum Ausführen von Abfragen nicht vertraut sind, schlage ich vor, damit in einer eigenständigen Konsolen-App zu experimentieren. Ich werde weitere Artikel schreiben, die sich mit der Verwendung von EF Core befassen, aber hier ist zunächst ein Beispiel für das Einfügen eines Datensatzes in die Datenbank:

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

class Program
{
	static void Main(string[] args)
	{
		var config = new ConfigurationBuilder()
			.SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
			.AddJsonFile("appsettings.json")
			.AddUserSecrets<Program>()
			.Build();


		using (var context = new StreamingServiceContext(config.GetConnectionString("Default")))
		{
			context.Database.Migrate();

			context.Add(new Movie 
			{ 
			   Name = "John Wick",
			   Description = "A revenge-seeking assassin goes after EVERYONE",
			   ReleaseYear = 2014,
			   RuntimeMinutes = 101
			});
			context.SaveChanges();
		}
	}
}
Code language: C# (cs)

Wenn Sie in die Datenbank schauen, können Sie sehen, dass dieser Datensatz in die Movies-Tabelle eingefügt wurde.

Quellcode auf GitHub

Der in diesem Artikel gezeigte Quellcode ist auf GitHub verfügbar. Wenn Sie den Code aus diesem Repository verwenden, stellen Sie sicher, dass Sie dotnet ef installieren, damit Sie Migrationen hinzufügen/anwenden können.