Entwickler Basics: Entity Framework 6 Code First für eine DotNet Anwendung zu Microsoft SQL Server

Einleitung

Dieser Artikel gibt einen kurzen Überblick über die notwendigen Schritte, um eine Anwendung mit dem Entity Framework zu betreiben und Code First zu betreiben.

Hinzufügen des notwendigen Nuget Paketes

Damit das Entity Framework im Projekt genutzt werden kann muss zunächst das Entity Framework als NuGet Paket hinzugefügt werden.

In Visual Studio erfolgt das über die folgende Option:

Erstellen des Daten Models

Als nächstes muss eine oder mehrere Klassen für das abzulegende Datenmodel abgelegt werden.

In folgenden kleinen Beispiel definieren wir Kundendaten in Bezug zu Verträgen:

Contracts:

using System.ComponentModel.DataAnnotations;

namespace TestDBAccess.DataModel  
{
    public class Contracts
    {
        [Key]
        public int ContractId { get; set; }

        [StringLength(255)]
        public string ContractName { get; set; }

        public double ContractSum { get; set; }

    }
}

Customers:

using System.ComponentModel.DataAnnotations;

namespace TestDBAccess.DataModel  
{
    public class Customers
    {
        [Key]
        public int CustomerId { get; set; }

        [StringLength(255)]
        public string FirstName { get; set; }

        [StringLength(255)]
        public string LastName { get; set; }

        public bool IsActive { get; set; }

        // Every Customer can have mutliple Contracts
        public virtual ICollection<Contracts> Contracts { get; set; }

    }
}

Konfigration von App.config bzw. Web.Config

Je nachdem, ob eine Client-App oder eine Web-Applikation erstellt wird, ist für das Entity Framework die entsprechende .config Datei anzupassen. Hier ist insbesondere der ConnectionString zur MS SQL Datenbank anzugeben. (Servername, Instanzname und DatenbankName sind natürlich entsprechend der Konfiguration anzupassen)

  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />       
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="Default" connectionString="Data Source=Servername\Instanzname;Initial Catalog=DatenbankName;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>

Erstellen des DBContext

Damit die Daten aus dem Entity Framework verwendet werden können, ist nun ein Context anzulegen:

using System.Data.Entity;

namespace TestDBAccess.DataModel  
{
    public class DemoContext : DbContext
    {
        public DemoContext() : base("Default")
        {
        }
        public DbSet<Customers> Customers { get; set; }
        public DbSet<Contracts> Contracts { get; set; }

    }
}

Aktivieren und Einrichten der Migrations

Die Verwaltung der Updates der Datenbankstrukturen erfolgt über sogenannte Migrations.

Um das Projekt für Migrations zu aktivieren ist folgendes Kommando in der "Package Management Console" (Im Menü über View\Other Windows\Package Management Console) auszuführen:

Enable-Migrations  

Anschließend enthält das Project einen neuen Ordner "Migrations":

Nun kann für die initiale Struktur ein Migration File erstellt werden. Hierbei ist wieder die "Package Management Console" zu verwenden:

Add-Migration InitialDatabase  

Anschließend sollte automatisch folgender Code erzeugt werden:

namespace TestDBAccess.Migrations  
{
    using System;
    using System.Data.Entity.Migrations;

    public partial class InitialDatabase : DbMigration
    {
        public override void Up()
        {
            CreateTable(
                "dbo.Contracts",
                c => new
                    {
                        ContractId = c.Int(nullable: false, identity: true),
                        ContractName = c.String(maxLength: 255),
                        ContractSum = c.Double(nullable: false),
                        Customers_CustomerId = c.Int(),
                    })
                .PrimaryKey(t => t.ContractId)
                .ForeignKey("dbo.Customers", t => t.Customers_CustomerId)
                .Index(t => t.Customers_CustomerId);

            CreateTable(
                "dbo.Customers",
                c => new
                    {
                        CustomerId = c.Int(nullable: false, identity: true),
                        FirstName = c.String(maxLength: 255),
                        LastName = c.String(maxLength: 255),
                        IsActive = c.Boolean(nullable: false),
                    })
                .PrimaryKey(t => t.CustomerId);

        }

        public override void Down()
        {
            DropForeignKey("dbo.Contracts", "Customers_CustomerId", "dbo.Customers");
            DropIndex("dbo.Contracts", new[] { "Customers_CustomerId" });
            DropTable("dbo.Customers");
            DropTable("dbo.Contracts");
        }
    }
}

Nun kann man die Änderungen in die Datenbank einspielen: (wieder über die Package Management Console)

update-database  

Anschließend sind die beiden Tabellen und die Tabelle "dbo.__MigrationHistory" erstellt worden und können im "Microsoft SQL Management Studio" angesehen werden:

Zusammenfassung

Ich hoffe hiermit in sehr kurzen Schritten die Anlage für Entity Framework in der "alten" DotNet Welt ausreichend beschrieben zu haben.