Code First do existující databáze

Tento podrobný návod obsahuje úvod do vývoje Code First, který cílí na existující databázi. Code First umožňuje definovat model pomocí C# nebo VB.Net tříd. Volitelně je možné provést další konfiguraci pomocí atributů ve vašich třídách a vlastnostech nebo pomocí rozhraní API fluent.

Předpoklady

K dokončení tohoto návodu budete muset mít nainstalovanou sadu Visual Studio 2012 nebo Visual Studio 2013 .

Budete také potřebovat nainstalovanou verzi 6.1 (nebo novější) nástrojů Entity Framework pro Visual Studio . Informace o instalaci nejnovější verze nástrojů Entity Framework najdete v tématu Získání entity Framework .

1. Vytvoření existující databáze

Obvykle platí, že když cílíte na existující databázi, bude již vytvořena, ale pro účely tohoto názorného postupu potřebujeme vytvořit databázi pro přístup.

Pojďme pokračovat a vygenerovat databázi.

  • Otevřete sadu Visual Studio.

  • Zobrazení –> Průzkumník serveru

  • Klikněte pravým tlačítkem na Připojení iony dat –> přidat Připojení ion...

  • Pokud jste se ještě nepřipojili k databázi z Průzkumníka serveru, musíte jako zdroj dat vybrat Microsoft SQL Server .

    Select Data Source

  • Připojení do instance LocalDB a zadejte Blogování jako název databáze

    LocalDB Connection

  • Vyberte OK a zobrazí se dotaz, jestli chcete vytvořit novou databázi, vyberte Ano.

    Create Database Dialog

  • Nová databáze se teď zobrazí v Průzkumníku serveru, klikněte na ni pravým tlačítkem myši a vyberte Nový dotaz.

  • Zkopírujte následující SQL do nového dotazu, klikněte pravým tlačítkem myši na dotaz a vyberte Spustit.

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. Vytvoření aplikace

Abychom mohli postupovat jednoduše, vytvoříme základní konzolovou aplikaci, která k přístupu k datům používá Code First:

  • Otevřete sadu Visual Studio.
  • Soubor -> Nový -> Projekt...
  • V nabídce vlevo vyberte Windows a konzolovou aplikaci.
  • Jako název zadejte CodeFirstExistingDatabaseSample .
  • Vyberte OK.

 

3. Model zpětné analýzy

Nástroje Entity Framework Tools pro Visual Studio použijeme k vygenerování počátečního kódu pro mapování databáze. Tyto nástroje pouze generují kód, který můžete také zadat ručně, pokud chcete.

  • Projekt –> přidat novou položku...

  • V nabídce vlevo vyberte Data a pak ADO.NET Entity Data Model.

  • Jako název zadejte BloggingContext a klikněte na OK.

  • Tím se spustí Průvodce datovým modelem entity.

  • Výběr možnosti Code First z databáze a kliknutí na Další

    Wizard One CFE

  • Vyberte připojení k databázi, kterou jste vytvořili v první části, a klikněte na Další.

    Wizard Two CFE

  • Kliknutím na zaškrtávací políčko vedle tabulek naimportujete všechny tabulky a kliknete na Dokončit.

    Wizard Three CFE

Po dokončení procesu zpětné analýzy se do projektu přidá několik položek, pojďme se podívat, co se přidalo.

Konfigurační soubor

Do projektu byl přidán soubor App.config, tento soubor obsahuje připojovací řetězec do existující databáze.

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

Všimněte si také některých dalších nastavení v konfiguračním souboru, jedná se o výchozí nastavení EF, která říkají Code First, kde se mají vytvářet databáze. Vzhledem k tomu, že namapujeme na existující databázi, bude toto nastavení v naší aplikaci ignorováno.

Odvozený kontext

Do projektu byla přidána třída BloggingContext . Kontext představuje relaci s databází, která nám umožňuje dotazovat a ukládat data. Kontext zveřejňuje TEntity> DbSet<pro každý typ v našem modelu. Všimněte si také, že výchozí konstruktor volá základní konstruktor pomocí syntaxe name= . To říká Code First, že připojovací řetězec použít pro tento kontext by se měl načíst z konfiguračního souboru.

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)
        {
        }
    }

Při použití připojovací řetězec v konfiguračním souboru byste měli vždy použít syntaxi name= . Tím se zajistí, že pokud připojovací řetězec není k dispozici, entity Framework vyvolá místo vytvoření nové databáze podle konvence.

Třídy modelů

Nakonec se do projektu přidala také třída blogů a příspěvků. Jedná se o doménové třídy, které tvoří náš model. Zobrazí se datové poznámky použité u tříd pro určení konfigurace, kde konvence Code First nebudou odpovídat struktuře existující databáze. Uvidíte například poznámku StringLength na Blog.Name a Blog.Url , protože mají v databázi maximální délku 200 (výchozí hodnota Code First je použití maximální délky podporované poskytovatelem databáze – nvarchar(max) v SQL Serveru).

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. Čtení a zápis dat

Teď, když máme model, je čas ho použít pro přístup k některým datům. Implementujte metodu Main v souboru Program.cs , jak je znázorněno níže. Tento kód vytvoří novou instanci našeho kontextu a pak ji použije k vložení nového blogu. Potom pomocí dotazu LINQ načte všechny blogy z databáze seřazené abecedně podle názvu.

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();
        }
    }
}

Teď můžete aplikaci spustit a otestovat ji.

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...

 

Co když se moje databáze změní?

Průvodce Code First to Database je navržený tak, aby vygeneroval výchozí sadu tříd, které pak můžete upravit a upravit. Pokud se schéma databáze změní, můžete třídy buď upravit ručně, nebo provést jinou zpětnou analýzu k přepsání tříd.

Použití Migrace Code First k existující databázi

Pokud chcete použít Migrace Code First s existující databází, přečtěte si Migrace Code First k existující databázi.

Shrnutí

V tomto názorném postupu jsme se podívali na vývoj Code First pomocí existující databáze. Pomocí nástrojů Entity Framework pro Visual Studio jsme provedli zpětnou analýzu sady tříd mapovaných na databázi a mohli jsme je použít k ukládání a načítání dat.