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. Aby uzyskać informacje na temat instalowania najnowszej wersji narzędzi Entity Framework Tools, zobacz Pobieranie programu Entity Framework Framework.
1. Tworzenie istniejącej bazy danych
Zazwyczaj w przypadku określania wartości docelowej istniejącej bazy danych zostanie ona już utworzona, ale w tym przewodniku musimy utworzyć bazę danych, aby uzyskać dostęp.
Wygenerujmy bazę danych.
Otwórz program Visual Studio.
Widok —> Eksplorator serwera
Kliknij prawym przyciskiem myszy pozycję Połączenie ions danych —> Dodaj Połączenie ion...
Jeśli nie nawiązaliśmy połączenia z bazą danych z Eksploratora serwera przed wybraniem programu Microsoft SQL Server jako źródła danych
Połączenie do wystąpienia usługi LocalDB i wprowadź Rejestrowanie jako nazwa bazy danych
Wybierz przycisk OK i zostanie wyświetlony monit o utworzenie nowej bazy danych, wybierz pozycję Tak
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ź wartość 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 pozycję Dane z menu po lewej stronie, a następnie ADO.NET model danych jednostki
Wprowadź ciąg BloggingContext jako nazwę i kliknij przycisk OK.
Spowoduje to uruchomienie Kreatora modelu danych jednostki
Wybierz pozycję Code First z bazy danych i kliknij przycisk Dalej
Wybierz połączenie z bazą danych utworzoną w pierwszej sekcji, a następnie kliknij przycisk Dalej
Kliknij pole wyboru obok pozycji Tabele, aby zaimportować wszystkie tabele , a następnie kliknij przycisk Zakończ
Po zakończeniu procesu inżyniera odwrotnego do projektu zostanie dodanych wiele elementów, przyjrzyjmy się dodaniu elementów.
Plik konfiguracji
Plik App.config został dodany do projektu. Ten plik zawiera parametry połączenia do istniejącej bazy 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, to ustawienie zostanie 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 uwidacznia wartość TEntity> dbSet<dla każdego typu w naszym modelu. Zauważysz również, że domyślny konstruktor wywołuje konstruktor podstawowy przy użyciu nazwy = składni. Informuje to code first, że parametry połączenia do użycia dla tego kontekstu powinny zostać załadowane 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 parametry połączenia w pliku konfiguracji. Gwarantuje to, że jeśli parametry połączenia nie jest obecny, program Entity Framework 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 zobaczysz adnotację StringLength w Blog.Name i Blog.Url , 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 pliku Program.cs , jak pokazano poniżej. Ten kod tworzy nowe wystąpienie kontekstu, a następnie używa go do wstawienia nowego bloga. 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 punktów początkowych klas, które można następnie dostosować i zmodyfikować. Jeśli schemat bazy danych zmieni się, możesz ręcznie edytować klasy lub wykonać innego inżyniera odwrotnego, aby zastąpić klasy.
Używanie Migracje Code First do istniejącej bazy danych
Jeśli chcesz użyć Migracje Code First z istniejącą bazą danych, zobacz 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 do odtworzenia zestawu klas mapowanych na bazę danych i mogą służyć do przechowywania i pobierania danych.