Code First an eine vorhandene DatenbankCode First to an Existing Database

Dieses Video und die schrittweise exemplarische Vorgehensweise bieten eine Einführung in Code First Entwicklung für eine vorhandene Datenbank.This video and step-by-step walkthrough provide an introduction to Code First development targeting an existing database. Mit Code First können Sie das Modell mithilfe von C- # oder VB.NET-Klassen definieren.Code First allows you to define your model using C# or VB.Net classes. Optional kann eine zusätzliche Konfiguration mithilfe von Attributen in ihren Klassen und Eigenschaften oder mithilfe einer fließenden API ausgeführt werden.Optionally additional configuration can be performed using attributes on your classes and properties or by using a fluent API.

Video ansehenWatch the video

Dieses Video ist nun auf Channel 9 verfügbar.This video is now available on Channel 9.

VoraussetzungenPre-Requisites

Sie müssen Visual Studio 2012 oder Visual Studio 2013 installiert haben, um diese exemplarische Vorgehensweise abzuschließen.You will need to have Visual Studio 2012 or Visual Studio 2013 installed to complete this walkthrough.

Sie benötigen auch Version 6,1 (oder höher) der Entity Framework Tools für Visual Studio .You will also need version 6.1 (or later) of the Entity Framework Tools for Visual Studio installed. Weitere Informationen zum Installieren der neuesten Version des Entity Framework Tools finden Sie unter Get Entity Framework .See Get Entity Framework for information on installing the latest version of the Entity Framework Tools.

1. Erstellen Sie eine vorhandene Datenbank.1. Create an Existing Database

Wenn Sie eine vorhandene Datenbank als Ziel haben, wird Sie in der Regel bereits erstellt, aber in dieser exemplarischen Vorgehensweise müssen wir eine Datenbank erstellen, auf die zugegriffen werden kann.Typically when you are targeting an existing database it will already be created, but for this walkthrough we need to create a database to access.

Nun generieren wir die Datenbank.Let's go ahead and generate the database.

  • Öffnen Sie Visual Studio.Open Visual Studio

  • Ansicht- > Server-ExplorerView -> Server Explorer

  • Klicken Sie mit der rechten Maustaste auf Datenverbindungen- > Verbindung hinzufügen...Right click on Data Connections -> Add Connection…

  • Wenn Sie über Server-Explorer keine Verbindung mit einer Datenbank hergestellt haben, müssen Sie Microsoft SQL Server als Datenquelle auswählen.If you haven’t connected to a database from Server Explorer before you’ll need to select Microsoft SQL Server as the data source

    Datenquelle auswählen

  • Stellen Sie eine Verbindung mit ihrer localdb-Instanz her, und geben Sie als Datenbanknamen BlogConnect to your LocalDB instance, and enter Blogging as the database name

    Localdb-Verbindung

  • Wählen Sie OK aus, und Sie werden gefragt, ob Sie eine neue Datenbank erstellen möchten, und wählen Sie Ja aus.Select OK and you will be asked if you want to create a new database, select Yes

    Dialog Feld Create Database

  • Die neue Datenbank wird nun in Server-Explorer angezeigt, klicken Sie mit der rechten Maustaste darauf, und wählen Sie neue Abfrage aus.The new database will now appear in Server Explorer, right-click on it and select New Query

  • Kopieren Sie den folgenden SQL-Befehl in die neue Abfrage, klicken Sie mit der rechten Maustaste auf die Abfrage, und wählen Sie Ausführen .Copy the following SQL into the new query, then right-click on the query and select Execute

CREATE TABLE [dbo].[Blogs] (
    [BlogId] INT IDENTITY (1, 1) NOT NULL,
    [Name] NVARCHAR (200) NULL,
    [Url]  NVARCHAR (200) NULL,
    CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY CLUSTERED ([BlogId] ASC)
);

CREATE TABLE [dbo].[Posts] (
    [PostId] INT IDENTITY (1, 1) NOT NULL,
    [Title] NVARCHAR (200) NULL,
    [Content] NTEXT NULL,
    [BlogId] INT NOT NULL,
    CONSTRAINT [PK_dbo.Posts] PRIMARY KEY CLUSTERED ([PostId] ASC),
    CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) ON DELETE CASCADE
);

INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('The Visual Studio Blog', 'http://blogs.msdn.com/visualstudio/')

INSERT INTO [dbo].[Blogs] ([Name],[Url])
VALUES ('.NET Framework Blog', 'http://blogs.msdn.com/dotnet/')

2. Erstellen der Anwendung2. Create the Application

Um dies zu gewährleisten, wird eine einfache Konsolenanwendung erstellt, die Code First für den Datenzugriff verwendet:To keep things simple we will build a basic console application that uses Code First to do the data access:

  • Öffnen Sie Visual Studio.Open Visual Studio
  • Datei- > New- > Project...File -> New -> Project…
  • Wählen Sie im Menü auf der linken Seite und Konsolenanwendung Windows aus.Select Windows from the left menu and Console Application
  • Geben Sie codefirstexistingdatabasesample als Name ein.Enter CodeFirstExistingDatabaseSample as the name
  • Klicken Sie auf OK.Select OK

 

3. Reverse-Engineering-Modell3. Reverse Engineer Model

Wir verwenden die Entity Framework Tools für Visual Studio, um uns dabei zu unterstützen, Code zu generieren, der der Datenbank zugeordnet wird.We will use the Entity Framework Tools for Visual Studio to help us generate some initial code to map to the database. Diese Tools erzeugen lediglich Code, den Sie bei Bedarf auch per Hand eingeben können.These tools are just generating code that you could also type by hand if you prefer.

  • Project- > Neues Element hinzufügen...Project -> Add New Item…

  • Wählen Sie im linken Menü Daten aus, und klicken Sie dann auf ADO.NET Entity Data ModelSelect Data from the left menu and then ADO.NET Entity Data Model

  • Geben Sie bloggingcontext als Name ein, und klicken Sie auf OK .Enter BloggingContext as the name and click OK

  • Dadurch wird der Entity Data Model-Assistent gestartet.This launches the Entity Data Model Wizard

  • Wählen Sie aus Datenbank Code First aus , und klicken Sie auf weiterSelect Code First from Database and click Next

    Assistent ein CFE

  • Wählen Sie die Verbindung mit der Datenbank, die Sie im ersten Abschnitt erstellt haben, und klicken Sie auf weiter .Select the connection to the database you created in the first section and click Next

    Assistent zwei CFE

  • Aktivieren Sie das Kontrollkästchen neben Tabellen , um alle Tabellen zu importieren, und klicken SieClick the checkbox next to Tables to import all tables and click Finish

    Assistent drei CFE

Nachdem der Reverse-Engineering-Prozess abgeschlossen wurde, wird dem Projekt eine Reihe von Elementen hinzugefügt. wir sehen uns nun an, was hinzugefügt wurde.Once the reverse engineer process completes a number of items will have been added to the project, let's take a look at what's been added.

KonfigurationsdateiConfiguration file

Eine App.config-Datei wurde dem Projekt hinzugefügt. diese Datei enthält die Verbindungs Zeichenfolge für die vorhandene Datenbank.An App.config file has been added to the project, this file contains the connection string to the existing database.

<connectionStrings>
  <add  
    name="BloggingContext"  
    connectionString="data source=(localdb)\mssqllocaldb;initial catalog=Blogging;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"  
    providerName="System.Data.SqlClient" />
</connectionStrings>

Sie sehen auch einige andere Einstellungen in der Konfigurationsdatei. Dies sind die standardmäßigen EF-Einstellungen, die Code First, wo Datenbanken erstellt werden sollen. Da wir eine Zuordnung zu einer vorhandenen Datenbank durchführt, werden diese Einstellungen in unserer Anwendung ignoriert.You’ll notice some other settings in the configuration file too, these are default EF settings that tell Code First where to create databases. Since we are mapping to an existing database these setting will be ignored in our application.

Abgeleiteter KontextDerived Context

Dem Projekt wurde eine bloggingcontext -Klasse hinzugefügt.A BloggingContext class has been added to the project. Der Kontext stellt eine Sitzung mit der Datenbank dar und ermöglicht das Abfragen und Speichern von Daten.The context represents a session with the database, allowing us to query and save data. Der Kontext macht eine **dbset- < TEntity > ** für jeden Typ in unserem Modell verfügbar.The context exposes a DbSet<TEntity> for each type in our model. Sie werden auch bemerken, dass der Standardkonstruktor einen Basiskonstruktor mit der Syntax Name = aufruft.You’ll also notice that the default constructor calls a base constructor using the name= syntax. Dadurch wird Code First, dass die für diesen Kontext zu verwendende Verbindungs Zeichenfolge aus der Konfigurationsdatei geladen werden soll.This tells Code First that the connection string to use for this context should be loaded from the configuration file.

public partial class BloggingContext : DbContext
    {
        public BloggingContext()
            : base("name=BloggingContext")
        {
        }

        public virtual DbSet<Blog> Blogs { get; set; }
        public virtual DbSet<Post> Posts { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }

Sie sollten immer die Syntax Name = verwenden, wenn Sie eine Verbindungs Zeichenfolge in der Konfigurationsdatei verwenden. Dadurch wird sichergestellt, dass, wenn die Verbindungs Zeichenfolge nicht vorhanden ist, Entity Framework ausgelöst wird, anstatt eine neue Datenbank gemäß der Konvention zu erstellen.You should always use the name= syntax when you are using a connection string in the config file. This ensures that if the connection string is not present then Entity Framework will throw rather than creating a new database by convention.

ModellklassenModel classes

Schließlich wurden dem Projekt auch ein Blog und eine Post -Klasse hinzugefügt.Finally, a Blog and Post class have also been added to the project. Dabei handelt es sich um die Domänen Klassen, aus denen unser Modell besteht.These are the domain classes that make up our model. Sie sehen Daten Anmerkungen, die auf die Klassen angewendet werden, um die Konfiguration anzugeben, bei der die Code First Konventionen nicht mit der Struktur der vorhandenen Datenbank übereinstimmen.You'll see Data Annotations applied to the classes to specify configuration where the Code First conventions would not align with the structure of the existing database. Beispielsweise wird die StringLength -Anmerkung auf Blog.Name und " Blog. URL " angezeigt, da Sie eine maximale Länge von 200 in der Datenbank aufweist (der Code First Standard ist die Verwendung der maximale-Länge, die vom Datenbankanbieter unterstützt wird- nvarchar (max) in SQL Server).For example, you'll see the StringLength annotation on Blog.Name and Blog.Url since they have a maximum length of 200 in the database (the Code First default is to use the maximun length supported by the database provider - nvarchar(max) in SQL Server).

public partial class Blog
{
    public Blog()
    {
        Posts = new HashSet<Post>();
    }

    public int BlogId { get; set; }

    [StringLength(200)]
    public string Name { get; set; }

    [StringLength(200)]
    public string Url { get; set; }

    public virtual ICollection<Post> Posts { get; set; }
}

4. lesen & schreiben von Daten4. Reading & Writing Data

Nachdem wir nun über ein Modell verfügen, ist es an der Zeit, es für den Zugriff auf einige Daten zu verwenden.Now that we have a model it’s time to use it to access some data. Implementieren Sie die Main -Methode in Program.cs , wie unten gezeigt.Implement the Main method in Program.cs as shown below. Mit diesem Code wird eine neue Instanz des Kontexts erstellt und anschließend verwendet, um einen neuen Blogeinzufügen.This code creates a new instance of our context and then uses it to insert a new Blog. Anschließend wird eine LINQ-Abfrage verwendet, um alle Blogs aus der Datenbank alphabetisch nach Titelabzurufen.Then it uses a LINQ query to retrieve all Blogs from the database ordered alphabetically by Title.

class Program
{
    static void Main(string[] args)
    {
        using (var db = new BloggingContext())
        {
            // Create and save a new Blog
            Console.Write("Enter a name for a new Blog: ");
            var name = Console.ReadLine();

            var blog = new Blog { Name = name };
            db.Blogs.Add(blog);
            db.SaveChanges();

            // Display all Blogs from the database
            var query = from b in db.Blogs
                        orderby b.Name
                        select b;

            Console.WriteLine("All blogs in the database:");
            foreach (var item in query)
            {
                Console.WriteLine(item.Name);
            }

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }
}

Sie können die Anwendung jetzt ausführen und testen.You can now run the application and test it.

Enter a name for a new Blog: ADO.NET Blog
All blogs in the database:
.NET Framework Blog
ADO.NET Blog
The Visual Studio Blog
Press any key to exit...

 

Was geschieht, wenn meine Datenbank geändert wird?What if My Database Changes?

Der Assistent für die Code First-Datenbank ist darauf ausgelegt, einen Ausgangspunkt Satz von Klassen zu generieren, die Sie dann optimieren und ändern können.The Code First to Database wizard is designed to generate a starting point set of classes that you can then tweak and modify. Wenn das Datenbankschema geändert wird, können Sie entweder die Klassen manuell bearbeiten oder einen weiteren umgekehrten Ingenieur ausführen, um die Klassen zu überschreiben.If your database schema changes you can either manually edit the classes or perform another reverse engineer to overwrite the classes.

Verwenden von Code First-Migrationen für eine vorhandene DatenbankUsing Code First Migrations to an Existing Database

Wenn Sie Code First-Migrationen mit einer vorhandenen Datenbank verwenden möchten, lesen Sie Code First-Migrationen zu einer vorhandenen Datenbank.If you want to use Code First Migrations with an existing database, see Code First Migrations to an existing database.

ZusammenfassungSummary

In dieser exemplarischen Vorgehensweise haben wir Code First Entwicklung mit einer vorhandenen Datenbank untersucht.In this walkthrough we looked at Code First development using an existing database. Wir haben die Entity Framework Tools für Visual Studio verwendet, um einen Satz von Klassen umzukehren, die der Datenbank zugeordnet sind und zum Speichern und Abrufen von Daten verwendet werden können.We used the Entity Framework Tools for Visual Studio to reverse engineer a set of classes that mapped to the database and could be used to store and retrieve data.