äž»ãªåé¡ã¯ãå§åçå€æ°ã®EF Coreãããªã¢ã«ãVisual Studioã®äœ¿çšãæ瀺ããŠãããïŒä»£ããã«ã軜éã®ã¯ãã¹ãã©ãããã©ãŒã .NET Coreãã¥ãŒãã³ã°ã䜿çšããŠããïŒããã¹ã¯ãããã§EF Coreã䜿çšãããããšãèæ ®ããŠããªãããšã§ãã Windows Formsãã¬ãŒã ã¯ãŒã¯ã«åºã¥ãã¢ããªã±ãŒã·ã§ã³ïŒä»£ããã«ãéåžžã¯ASP.NETã³ã¢ã代ããã«æ³å®ãããŸãïŒã ãã ãããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ã®åœ¢åŒã®ãœãªã¥ãŒã·ã§ã³ãæãŸããïŒãŸãã¯å¿ èŠãªïŒå ŽåããããEntity Framework Coreã«ã¯Entity Framework 6ãšæ¯èŒããŠããã€ãã®å©ç¹ïŒãã¡ãããæ¬ ç¹ïŒããããšããåé¡ãšç¶æ³ããŸã ãããŸãã ããã«ãWebã§å©çšå¯èœãªäŸã§ã¯ãååãšããŠãããŒã¿ããŒã¹ãžã®ã¬ã³ãŒãã®è¿œå ãªã©ãæãåºæ¬çãªã¢ã¯ã·ã§ã³ã®ã¿ãèæ ®ããããã®åŸã®ããŒã¿æœåºã®åé¡ããèæ ®ãããªãããšãå€ãããã®äžã«ã¯ãã§ã«æãããªç¹ã¯ãããŸããã ãŸããEF Coreã¯éåžžã«æŽ»çºã«éçºãããŠããã次ã®ãããªå€ãã®åœä»€ã®é¢é£æ§ã倱ãããŠããŸãã ãã®çç±ã§ã
VisualStudo 2015ã§EF Coreã䜿çšããŠæå°éã®WinFormsãã¢ã¢ããªã±ãŒã·ã§ã³ãéçºãããããªäžèŠåºæ¬çãªã¿ã¹ã¯ã解決ããããšãããšãäŸå€ãäºæããªãåäœããã¥ãŒããªã¢ã«ã§èªæãªããšãè¡ãæ¹æ³ã®ç解äžè¶³ãªã©ã®äžé£ã®åé¡ã«ééããŸããã ã ãã®çµæãGoogleã質åãå®éšãè¡ãããšã§ã以äžã§èª¬æããããã€ãã®æé ãã»ãšãã©ç²ç®çã«æããå¿ èŠããããŸããã
ãã©ãããã©ãŒã ãšããŠã.NET Framework 4.6.1ãéžæããŸããïŒäœããã®çç±ã§ããŒãžã§ã³4.6.2ã¯Visual Studioã§å©çšå¯èœãªãªã¹ãã«è¡šç€ºãããŸãããã4.6.1ãéžæãããšãã¹ãŠãæ©èœããŸããããããã以åã®ããŒãžã§ã³ã§åäœããŸãããéçºç°å¢ãšããŠ-Visual Studio Community Edition 2015 Update 3ãDBMSãšããŠ-SQLiteãOSãšããŠ-Windows 7 64ããããšããŠãç§ã¯ãã§ãã¯ããŸããã§ããïŒã
以äžã¯ããã¢ã¢ããªã±ãŒã·ã§ã³ãé©åã«åäœãããšã©ãŒã¡ãã»ãŒãžãåä¿¡ãããªãã£ãã¹ãããã®ãªã¹ãã§ãã
0. .NET Framework 4.6.2ïŒ Webã€ã³ã¹ããŒã©ãŒ ã ãªãã©ã€ã³ã€ã³ã¹ããŒã©ãŒ ïŒã®ææ°ããŒãžã§ã³ãšVisual Studio 2015 Update 3ïŒ Webã€ã³ã¹ããŒã©ãŒã® æŽæ°ããªãã©ã€ã³ã€ã³ã¹ããŒã©ãŒISOã®æŽæ° ãVisual Studio 2015 Update Community Edition 3ã®Webã€ã³ã¹ããŒã©ãŒãã«ããŒãžã§ã³ ã ãªãã©ã€ã³ã ã€ã³ã¹ããŒã«ãããŠããããšã確èªããŸã ã€ã³ã¹ããŒã©ãŒISOãã«ããŒãžã§ã³ã®Visual Studio 2015 Update Community Edition 3ãšçµ±åãããæŽæ°ããã°ã©ã ïŒ
1. Windows Management Framework 5.0ãã€ã³ã¹ããŒã«ããŠãPowerShellãããŒãžã§ã³5.0ã«ã¢ããã°ã¬ãŒãããŸãã ç§ã¯ïŒWindows 7ããã³Visual Studio 2015ãšãããã®ãã¹ãŠã®æŽæ°ããã°ã©ã ãã€ã³ã¹ããŒã«ããåŸïŒã·ã¹ãã ã«ããŒãžã§ã³2.0ãããããã®ããã»ã¹ã§æ°ããããŒãžã§ã³ãèŠæ±ãããšã©ãŒã¡ãã»ãŒãžãåãåããŸãã
2. .NET Core 1.0.1ããŒã«ãã¬ãã¥ãŒ2ãã€ã³ã¹ããŒã«ããŸãïŒ Webã€ã³ã¹ããŒã©ãŒã䜿çšããŠã/ layoutã¹ã€ããã䜿çšããŠãªãã©ã€ã³é åžãäœæã§ããŸãïŒã
3. NuGetãªããžããªãæäœããããã®Visual Studioæ¡åŒµæ©èœã®æŽæ°ã ãããè¡ãã«ã¯ã çŽæ¥ãªã³ã¯ã§çŸåšã®ããŒãžã§ã³3.5.0.1996ãããŠã³ããŒãããããVisual Studioã®èšå®ãèªåæŽæ°ããããã®é©åãªæ¡åŒµãªããžããªãè¿œå ããŸãã

4. Windowsãã©ãŒã ã¢ããªã±ãŒã·ã§ã³ãªã©ã®æ°ãããããžã§ã¯ããäœæããŸãã ç§ã¯ããããVs2015WinFormsEfcSqliteCodeFirst20170304ExampleãïŒEntity Framework Coreããã³ãŒããã¡ãŒã¹ããã¢ãããŒããããã³2017幎3æ4æ¥ã®Visual Studio 2015ã®SQLite DBMSã䜿çšããå®éã®WinFormsã¢ããªã±ãŒã·ã§ã³ïŒãšåŒã³ãŸããã ã¿ãŒã²ãããã¬ãŒã ã¯ãŒã¯ãšããŠã.NET Framework 4.6.1ãéžæããŸãã
5.ãœãªã¥ãŒã·ã§ã³ãšã¯ã¹ãããŒã©ãŒããã«ã§ãããžã§ã¯ããå³ã¯ãªãã¯ãã[NuGetããã±ãŒãžã®ç®¡ç...]ãéžæãã[åç §]ã¿ãã«ç§»åããŠãMicrosoft.EntityFrameworkCore.Sqlite.Designããã³Microsoft.EntityFrameworkCore.Toolsãã€ã³ã¹ããŒã«ããŸãã çŸåšã®ããŒãžã§ã³ãã€ã³ã¹ããŒã«ããã«ã¯ãããã¬ãªãªãŒã¹ãå«ããããã§ãã¯ããã¯ã¹ããªã³ã«ããå¿ èŠããããŸã;å®å®ããŒãžã§ã³ã§ã¯ãäœããæ¬ èœããŠããå Žåãä¿®æ£ãããŠããªããã°ãããå ŽåããããŸãã çŸæç¹ã§ææ°ã®Microsoft.EntityFrameworkCore.Sqlite.Design 1.1.0ããã³Microsoft.EntityFrameworkCore.Tools 1.1.0-preview4-finalãã€ã³ã¹ããŒã«ããŸããã Microsoft.EntityFrameworkCore.Toolsã®ã€ã³ã¹ããŒã«ã«åé¡ãããå Žåã¯ãNuGetã³ãã³ãã©ã€ã³ã䜿çšããŠãããå®è¡ã§ããŸããæåŸ ãPM>ãã®åŸã«è¡šç€ºãããã³ã³ãœãŒã«ã§ãã¡ãã¥ãŒãã[ããŒã«]-[NuGetããã±ãŒãžãããŒãžã£ãŒ]-[ããã±ãŒãžãããŒãžã£ãŒã³ã³ãœãŒã«]ãéžæããŸã"Enter" Install-Package Microsoft.EntityFrameworkCore.Tools -Pre "
PM> Install-Package Microsoft.EntityFrameworkCore.Tools -Pre
6.ããŒã¿ã¢ãã«ã¯ã©ã¹ã®ãœãŒã¹ã³ãŒããã¡ã€ã«ãäœæããŸãã é åºã®ããã«ããããããã¢ãã«ãã®ãµããã©ã«ããŒã«é 眮ããŸããïŒããšã³ãã£ãã£ããšåŒã¶ãã®ãããã°ããããžã§ã¯ãã®ã«ãŒãã«ãããã¹ãŠã®ã¯ã©ã¹ãã¹ããŒãããã®ãåããã¡ã€ã«ã«ç§»åãããã®ããããŸãïŒã ãã®ã¢ãã«ã¯ãéœåžãšéœåžã®ãªã¹ããä¿åããããŒã¿ããŒã¹ã®ã±ãŒã¹ã¹ã¿ãã£ãèšè¿°ããŠããŸãã å人ç©ã¯1ã€ã®éœåžã«ã®ã¿é¢é£ä»ããããšãã§ããŸããäžè¬çã«ã©ã®éœåžããé¢é£ä»ããããŠãããã¯äžæã§ãã
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext.cs
using Microsoft.EntityFrameworkCore; namespace Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Model { public class Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext : DbContext { public DbSet<City> Cities { get; set; } public DbSet<Person> People { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Filename=Vs2015WinFormsEfcSqliteCodeFirst20170304Example.sqlite"); } } }
City.cs
using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; namespace Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Model { public class City { public int Id { get; set; } public string Name { get; set; } [InverseProperty("City")] public virtual ICollection<Person> People { get; set; } } }
Person.cs
using System.ComponentModel.DataAnnotations.Schema; namespace Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Model { public class Person { public int Id { get; set; } public string Name { get; set; } public string Surname { get; set; } public int? CityId { get; set; } [InverseProperty("People")] public virtual City City { get; set; } } }
7. PowerShellã¹ã¯ãªããã解決ããŸãããããè¡ãããªãå Žåããšã©ãŒã... \ packages \ Microsoft.EntityFrameworkCore.Tools.1.1.0-preview4-final \ tools \ init.ps1ãèªã¿èŸŒãããšãã§ããŸããããã®ã·ã¹ãã ã§ã¯ã¹ã¯ãªããã®å®è¡ãç¡å¹ã«ãªã£ãŠããããã§ãã ã ãããè¡ãã«ã¯ãNuGetã³ãã³ãã©ã€ã³ã«ç§»åãïŒã¡ãã¥ãŒã§[ããŒã«]-[NuGetããã±ãŒãžãããŒãžã£ãŒ]-[ããã±ãŒãžãããŒãžã£ãŒã³ã³ãœãŒã«]ãéžæïŒã次ã®ã³ãã³ããå®è¡ããŸãã
PM> Set-ExecutionPolicy RemoteSigned
8. ã移è¡ããäœæããŸãã ãããè¡ãã«ã¯ãã³ãŒããä¿åããŠã³ã³ãã€ã«ãïŒã¿ã€ããã¹ããªãããšã確èªããããã«ïŒãNuGetã³ãã³ãã©ã€ã³ã«ç§»åãã次ã®ã³ãã³ããå®è¡ããŸãã
PM> Add-Migration -Name "Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration" -Context "Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext"
çµæãšããŠããããžã§ã¯ããšãVs2015WinFormsEfcSqliteCodeFirst20170304ExampleContextModelSnapshot.csãããã³ã20170304204355_Vs2015WinFormsEfcSqliteCodeFirstManagementããšãã2ã€ã®ãã¡ã€ã«ããããžã§ã¯ãã«è¡šç€ºãããŸããæãããªåœ¢åŒã§çæãããç¬éãåŸã§ãVs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration.csãã®ã¿ãæ®ããŠå®å šã«åé€ããŸããã
9.çæããããã¡ã€ã«ãç·šéããŠãäžææ§ã®æ¡ä»¶ïŒäžæå¶çŽã2次ããŒãšãåŒã°ããïŒãéœåžã®ååã«è¿œå ããŸãïŒå®éã«ã¯ããã¡ãããåãååã®éœåžããããŸãããäŸãã°ãããã¯ééã£ãŠããŸããïŒ
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration.cs
using Microsoft.EntityFrameworkCore.Migrations; namespace Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Migrations { public partial class Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleMigration : Migration { protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "Cities", columns: table => new { Id = table.Column<int>(nullable: false) .Annotation("Sqlite:Autoincrement", true), Name = table.Column<string>(nullable: true) }, constraints: table => { table.PrimaryKey("PK_Cities", x => x.Id); // table.UniqueConstraint("UQ_Cities_Name", x => x.Name); }); migrationBuilder.CreateTable( name: "People", columns: table => new { Id = table.Column<int>(nullable: false) .Annotation("Sqlite:Autoincrement", true), CityId = table.Column<int>(nullable: true), Name = table.Column<string>(nullable: true), Surname = table.Column<string>(nullable: true) }, constraints: table => { table.PrimaryKey("PK_People", x => x.Id); table.ForeignKey( name: "FK_People_Cities_CityId", column: x => x.CityId, principalTable: "Cities", principalColumn: "Id", onDelete: ReferentialAction.Restrict); }); migrationBuilder.CreateIndex( name: "IX_People_CityId", table: "People", column: "CityId"); } protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "People"); migrationBuilder.DropTable( name: "Cities"); } } }
Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContextModelSnapshot.cs
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Model; namespace Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Migrations { [DbContext(typeof(Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext))] partial class Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { modelBuilder .HasAnnotation("ProductVersion", "1.1.0-rtm-22752"); modelBuilder.Entity("Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Model.City", b => { b.Property<int>("Id") .ValueGeneratedOnAdd(); b.Property<string>("Name"); b.HasKey("Id"); // b.HasIndex("Name").IsUnique(); b.ToTable("Cities"); }); modelBuilder.Entity("Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Model.Person", b => { b.Property<int>("Id") .ValueGeneratedOnAdd(); b.Property<int?>("CityId"); b.Property<string>("Name"); b.Property<string>("Surname"); b.HasKey("Id"); b.HasIndex("CityId"); b.ToTable("People"); }); modelBuilder.Entity("Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Model.Person", b => { b.HasOne("Vs2015WinFormsEfcSqliteCodeFirst20170304Example.Model.City", "City") .WithMany("People") .HasForeignKey("CityId"); }); } } }
10.ããŒã¿ããŒã¹ãã¡ã€ã«ãçæããŸãã ãããè¡ãã«ã¯ãNuGetã³ãã³ãããã³ããã§æ¬¡ã®ã³ãã³ããå®è¡ããŸã
PM> Update-Database -Context "Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext"
ããŒã¿ããŒã¹ãã¡ã€ã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãã€ã«æžã¿exeãã¡ã€ã«ã眮ãããŠãããã£ã¬ã¯ããªãšåããã£ã¬ã¯ããªã«äœæãããŸããããã¯ãã... \ Vs2015WinFormsEfcSqliteCodeFirst20170304Example \ bin \ Debug \ Vs2015WinFormsEfcSqliteCodeFirst20170304Example.sqliteãã§ãã
ãã®æ®µéã§ãããšãã°ãå ¬åŒã³ã³ãœãŒã«ã¯ã©ã€ã¢ã³ãsqlite3ãŸãã¯ç¡æã®ã¯ãã¹ãã©ãããã©ãŒã GUIã·ã§ã«SQL BrowserçšDBãã©ãŠã¶ãŒã䜿çšããŠãäœæããããã¡ã€ã«å ã確èªããããŒãã«ãæ£ããäœæãããããšã確èªã§ããŸãã Cities and PeopleããŒãã«ã«å ããŠãEF CoreãªãŒããŒãããã®ãã__EFMigrationsHistoryããŒãã«ãšãSQLiteãªãŒããŒãããã®ããsqlite_sequenceããããŸãã
11.次ã«ããã©ãŒã ã®ãã¶ã€ããŒã«ç§»åãããã¿ã³ãé 眮ãã2åã¯ãªãã¯ããŠãã¿ã³ãã¯ãªãã¯ããããã®ã€ãã³ããã³ãã©ãŒãäœæããã³ãŒãã®ç·šéã«é²ã¿ãŸãã 以äžã¯ãããŒã¿ããŒã¹ã¬ã³ãŒãã䜿çšããåºæ¬ã¢ã¯ã·ã§ã³ã瀺ãã³ãŒãã§ãã ç§ã¯ãŸã Form1ãåžžã«MainFormã«ååå€æŽããç¿æ £ããããã³ã³ãããŒã«ã®æå³ã¯äŒŒãŠããŸãïŒãã®å Žåãå¯äžã®ã³ã³ãããŒã«ã¯mainButtonã®button1ã§ãïŒããããã¯å¥œã¿ã®åé¡ã§ãããããŒã ã§åãå ¥ããããŠããåœååºæºã§ãã
MainForm.cs
private void mainButton_Click(object sender, EventArgs e) { // using (var context = new Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext()) { foreach (var person in context.People) context.Remove(person); foreach (var city in context.Cities) context.Remove(city); context.SaveChanges(); } // // , using (var context = new Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext()) { var praha = new City { Name = "Praha" }; var london = new City { Name = "London" }; var madrid = new City { Name = "Madrid" }; var jan = new Person { Name = "Jan", City = praha }; var john = new Person { Name = "John", City = london }; var juan = new Person { Name = "Juan", City = madrid }; context.Cities.AddRange(praha, london, madrid); context.People.AddRange(jan, john, juan); context.SaveChanges(); } // , // , // ( ) using (var context = new Vs2015WinFormsEfcSqliteCodeFirst20170304ExampleContext()) { // Include(city => city.People) // context.Cities.Single(city => city.Name == "London"); // , .People null. // production .Single , // var london = context.Cities.Include(city => city.People)(city => city.Name == "London"); var peter = new Person { Name = "Peter", City = london }; var john = london.People.Single(person => person.Name == "John"); john.Surname = "Smith"; context.Add(peter); context.Update(john); context.SaveChanges(); } }
ãã¡ãããå®éã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã«è±å¯ãªã€ã³ã¿ãŒãã§ã€ã¹ãããæå³ã®ããããžãã¯ãå®è£ ããäŸå€åŠçãšããŒã¿æ€èšŒãè¿œå ããŠããããé²æ¢ããŸãããäžèšã®äŸã¯ãããè¡ãæ¹æ³ãç解ããã®ã«ååã§ãã
äžèšããã³é¢é£ããã³ãŒãã¯ãã¹ãŠãã¡ãããããŠã³ããŒãã§ããŸãã