Udostępnij za pośrednictwem


Kod pierwszy do istniejącej bazy danych

Ten przewodnik krok po kroku zawiera wprowadzenie do programowania Code First przeznaczonego dla istniejącej bazy danych. Funkcja Code First umożliwia zdefiniowanie modelu przy użyciu klas języka C# lub VB.Net. Opcjonalnie można wykonać dodatkową konfigurację przy użyciu atrybutów w klasach i właściwościach lub przy użyciu płynnego interfejsu API.

Wymagania wstępne

Aby ukończyć ten przewodnik, musisz mieć zainstalowany program Visual Studio 2012 lub Visual Studio 2013 .

Będzie również potrzebna wersja 6.1 (lub nowsza) zainstalowanych narzędzi Entity Framework Tools for Visual Studio . Zobacz Pobieranie programu Entity Framework, aby uzyskać informacje na temat instalowania najnowszej wersji narzędzi Entity Framework.

1. Tworzenie istniejącej bazy danych

Zwykle, gdy kierujesz się na istniejącą bazę danych, jest ona już utworzona, ale w tym przewodniku musimy utworzyć bazę danych, aby uzyskać do niej dostęp.

Wygenerujmy bazę danych.

  • Otwórz program Visual Studio.

  • Widok —> Eksplorator serwera

  • Kliknij prawym przyciskiem myszy pozycję Połączenia danych —> Dodaj połączenie...

  • Jeśli nie połączyłeś się z bazą danych z Eksploratora serwera wcześniej, będziesz musiał wybrać Microsoft SQL Server jako źródło danych.

    Wybieranie źródła danych

  • Połącz się z wystąpieniem bazy danych LocalDB i wprowadź Blogging jako nazwę bazy danych

    Połączenie bazy danych LocalDB

  • Wybierz przycisk OK i zostanie wyświetlony monit o utworzenie nowej bazy danych, wybierz pozycję Tak

    Okno dialogowe Tworzenie bazy danych

  • Nowa baza danych pojawi się teraz w Eksploratorze serwera, kliknij ją prawym przyciskiem myszy i wybierz pozycję Nowe zapytanie

  • Skopiuj następujący kod SQL do nowego zapytania, a następnie kliknij prawym przyciskiem myszy zapytanie i wybierz polecenie Wykonaj

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

Aby zachować prostotę, utworzymy podstawową aplikację konsolową, która używa funkcji Code First do uzyskiwania dostępu do danych:

  • Otwórz program Visual Studio.
  • Plik — Nowy —>> Projekt...
  • Wybierz pozycję Windows z menu po lewej stronie i pozycję Aplikacja konsolowa
  • Wprowadź CodeFirstExistingDatabaseSample jako nazwę
  • Wybierz OK

 

3. Model inżyniera odwrotnego

Użyjemy narzędzi Entity Framework Tools for Visual Studio, aby pomóc nam wygenerować początkowy kod do mapowania na bazę danych. Te narzędzia generują tylko kod, który można również wpisać ręcznie, jeśli wolisz.

  • Projekt —> dodaj nowy element...

  • Wybierz Dane z menu po lewej stronie, a następnie Model danych jednostki ADO.NET

  • Wprowadź BloggingContext jako nazwę i kliknij OK.

  • Spowoduje to uruchomienie Kreatora modelu danych jednostki

  • Wybierz pozycję Code First z bazy danych i kliknij przycisk Dalej

    Kreator One CFE

  • Wybierz połączenie z bazą danych utworzoną w pierwszej sekcji, a następnie kliknij przycisk Dalej

    Kreator dwa CFE

  • Kliknij pole wyboru obok pozycji Tabele , aby zaimportować wszystkie tabele, a następnie kliknij przycisk Zakończ

    Kreator trzeci CFE

Po zakończeniu procesu inżynierii odwrotnej do projektu zostanie dodana pewna liczba elementów, zobaczmy, co zostało dodane.

Plik konfiguracji

Plik App.config został dodany do projektu. Ten plik zawiera parametry połączenia z istniejącą bazą danych.

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

Zauważysz również inne ustawienia w pliku konfiguracji, są to domyślne ustawienia ef, które informują Code First, gdzie utworzyć bazy danych. Ponieważ mapujemy na istniejącą bazę danych, te ustawienia zostaną zignorowane w naszej aplikacji.

Kontekst pochodny

Do projektu została dodana klasa BloggingContext . Kontekst reprezentuje sesję z bazą danych, umożliwiając nam wykonywanie zapytań i zapisywanie danych. Kontekst udostępnia DbSet dla każdego typu w naszym modelu. Zauważysz również, że domyślny konstruktor wywołuje konstruktor podstawowy przy użyciu składni name=. Informuje to Code First, że łańcuch połączenia do użycia dla tego kontekstu powinien zostać załadowany z pliku konfiguracji.

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

Zawsze należy używać składni name= w przypadku używania parametrów połączenia w pliku konfiguracji. Gwarantuje to, że jeśli parametry połączenia nie są obecne, program Entity Framework zgłosi wyjątek zamiast tworzyć nową bazę danych zgodnie z konwencją.

Klasy modelu

Na koniec do projektu dodano również klasę Blog i Post . Są to klasy domen, które tworzą nasz model. Zobaczysz adnotacje danych zastosowane do klas, aby określić konfigurację, w której konwencje Code First nie będą zgodne ze strukturą istniejącej bazy danych. Na przykład w Blog.Name i Blog.Url zobaczysz adnotację StringLength, ponieważ mają maksymalną długość 200 w bazie danych (domyślną wartością code First jest użycie maksymalnej długości obsługiwanej przez dostawcę bazy danych — nvarchar(max) w programie 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. Odczytywanie i zapisywanie danych

Teraz, gdy mamy model, nadszedł czas, aby używać go do uzyskiwania dostępu do niektórych danych. Zaimplementuj metodę Main w Program.cs , jak pokazano poniżej. Ten kod tworzy nowe wystąpienie naszego kontekstu, a następnie używa go do wstawienia nowego Blog. Następnie używa zapytania LINQ, aby pobrać wszystkie blogi z bazy danych uporządkowane alfabetycznie według tytułu.

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

Teraz możesz uruchomić aplikację i ją przetestować.

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 zrobić, jeśli moja baza danych ulegnie zmianie?

Kreator Code First to Database został zaprojektowany w celu wygenerowania zestawu klas początkowych, które można następnie dostosować i zmodyfikować. Jeśli schemat bazy danych zmieni się, możesz ręcznie edytować klasy lub przeprowadzić kolejny proces odwrotnego inżynierowania, aby ponownie wygenerować klasy.

Używanie migracji Code First do istniejącej bazy danych

Jeśli chcesz użyć migracji Code First z istniejącą bazą danych, zobacz Code First Migrations to an existing database (Migracje code first do istniejącej bazy danych).

Podsumowanie

W tym przewodniku przyjrzeliśmy się programowi Code First przy użyciu istniejącej bazy danych. Użyliśmy narzędzi Entity Framework Tools for Visual Studio w celu odwrotnego projektowania zestawu klas zmapowanej na bazę danych, które mogą służyć do przechowywania i pobierania danych.