Entity Framework posiada trzy podejścia tworzenia i dołączanie bazy danych Code First, Model First i Database First. W tym wpisie poświęcę czas opisowi i implementacji pierwszemu z nich. W Code First w pierwszej kolejności powinniśmy napisać klasę odpowiadającą polom tabeli, a następnie za pomocą migration możemy stworzyć tabelę.
Ttworzymy prostą klasę reprezentującą pola z tabeli “Blog”.
public class Blog { [Key] public int BlogID { get; set; } public string Name { get; set; } public virtual List Posts { get; set; } }
Czwarta linijka kodu przedstawia EF – to znaczy, że dana propercja będzie kluczem głównym w tabeli.
Piąta i szósta linia odpowiadają nazwom i typom pól tworzonych.
W ósmej linijce przekazujemy do Entity informację, że blog może posiadać wiele postów z tabeli “Post”. Relacja jeden do wielu.
Klasa odpowiadająca postom:
public class Post { [Key] public int PostId { get; set; } public string Title { get; set; } public int BlogId { get; set; } public virtual Blog Blog { get; set; } }
Analogicznie co do klasy “Blog” – jedyną różnicą jest informacja, że 8 linijka odpowiada że jednemu przypisanemu blogowi może odpowiadać jeden post.
Ostatnia klasa określająca DbContext to znaczy: możliwość odwołania się do danych tabel.
public class BlogContext : DbContext { public DbSet Blogs { get; set; } public DbSet Posts { get; set; } }
Otwieramy Package Manager Console (Tools=>NuGet Package Manager=>Package Manager Console) w celu uruchomienia migracji.
Wpisujemy “Enable-Migrations” – tworzymy migracje i klase configuration.cs. Następnie dodajemy migracje komendą: “Add-Migration” – zabieg ten dodaje migracje w oparciu o zmiany wprowadzone do naszego modelu i tworzy klasę posiadającą dwie nadpisujące metody Up() – zawiera informacje co będzie zmieniane przy uruchomieniu aktualizacji, a Down() cofa zmiany. U mnie wygląda to następująco:
public override void Up() { CreateTable( "dbo.Blogs", c => new { BlogID = c.Int(nullable: false, identity: true), Name = c.String(), }) .PrimaryKey(t => t.BlogID); CreateTable( "dbo.Posts", c => new { PostId = c.Int(nullable: false, identity: true), Title = c.String(), BlogId = c.Int(nullable: false), }) .PrimaryKey(t => t.PostId) .ForeignKey("dbo.Blogs", t => t.BlogId, cascadeDelete: true) .Index(t => t.BlogId); }
public override void Down() { DropForeignKey("dbo.Posts", "BlogId", "dbo.Blogs"); DropIndex("dbo.Posts", new[] { "BlogId" }); DropTable("dbo.Posts"); DropTable("dbo.Blogs"); }
Wywołanie metody “Update-Database” utworzy nam bazę danych wraz z naszymi tabelami.
Kiedy stosujemy jakie podejście najlepiej obrazuje poniższy obrazek.