﻿
{"id":9624,"date":"2018-09-30T22:27:04","date_gmt":"2018-09-30T22:27:04","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=9624"},"modified":"2018-09-30T22:27:04","modified_gmt":"2018-09-30T22:27:04","slug":"asp-net-core-2-mvcde-migrations-ile-veritabani-islemleri","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-2-mvcde-migrations-ile-veritabani-islemleri\/","title":{"rendered":"Asp.NET Core 2 MVC&#8217;de Migrations \u0130le Veritaban\u0131 \u0130\u015flemleri"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde Asp.NET Core 2 MVC&#8217;de migration yap\u0131s\u0131n\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 inceleyece\u011fiz. \u0130lk olarak migration altyap\u0131s\u0131n\u0131n kurulumunu ger\u00e7ekle\u015ftirecek, ard\u0131ndan migration olu\u015fturacak, s\u00fcre\u00e7te migrationlar \u00fczerinde d\u00fczenleme i\u015flemleri ger\u00e7ekle\u015ftirecek ve t\u00fcm bu i\u015flemlerin neticesinde migration yap\u0131lar\u0131n\u0131n tetiklenmesi i\u00e7in komut sat\u0131r\u0131ndan veya \u00f6zel olarak tasarlayaca\u011f\u0131m\u0131z bir middleware \u00fczerinden olmak \u00fczere iki farkl\u0131 yoldan nas\u0131l \u00e7al\u0131\u015f\u0131laca\u011f\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<p>\u015eimdi gelin hi\u00e7 vakit kaybetmeden altyap\u0131m\u0131z\u0131 olu\u015fturmayla ba\u015flayal\u0131m.<\/p>\n<h3>Migration Altyap\u0131s\u0131n\u0131n Olu\u015fturulmas\u0131<\/h3>\n<p>Her\u015feyden \u00f6nce migration taraf\u0131ndan otomatik generate edilmesi i\u00e7in bir tablo temsil edecek olan entitymizi ve DbContext s\u0131n\u0131f\u0131m\u0131z\u0131 in\u015fa ederek i\u015fe ba\u015flayal\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Employee\r\n    {\r\n        public int Id { get; set; }\r\n        public string Name { get; set; }\r\n        public string SurName { get; set; }\r\n        public int Age { get; set; }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class DatabaseContext : DbContext\r\n    {\r\n        public DatabaseContext(DbContextOptions options)\r\n            : base(options)\r\n        { }\r\n        public DbSet&lt;Employee&gt; Employees { get; set; }\r\n    }\r\n<\/pre>\n<p>Olu\u015fturdu\u011fumuz &#8220;DatabaseContext&#8221; s\u0131n\u0131f\u0131 bizim &#8220;DbContext&#8221; s\u0131n\u0131f\u0131m\u0131z olacakt\u0131r. Dolay\u0131s\u0131yla bu s\u0131n\u0131f tipinden olabilecek t\u00fcm taleplere kar\u015f\u0131l\u0131k bir nesne d\u00f6nd\u00fcrebilmek i\u00e7in &#8220;Startup&#8221; s\u0131n\u0131f\u0131n\u0131n &#8220;ConfigureServices&#8221; metodunda a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmay\u0131 ger\u00e7ekle\u015ftiriyoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            #region DbContext\r\n            services.AddDbContext&lt;DatabaseContext&gt;(option =&gt; option.UseSqlServer(Configuration.GetConnectionString(&quot;DefaultConnection&quot;)));\r\n            #endregion\r\n            services.AddMvc();\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Burada dikkat ederseniz e\u011fer generic olan &#8220;AddDbContext&#8221; metodu sayesinde &#8220;DatabaseContext&#8221; s\u0131n\u0131f\u0131n\u0131n bir &#8220;DbContext&#8221; oldu\u011funu belirtmi\u015f bulunmaktay\u0131z ve veritaban\u0131 i\u015flemlerinde t\u00fcm taleplere kar\u015f\u0131l\u0131k ilgili s\u0131n\u0131ftan bir instance g\u00f6nderilmesine dair bildiride bulunmaktay\u0131z. Ayr\u0131ca g\u00f6nderilecek bu instance&#8217;da &#8220;UseSqlServer&#8221; fonksiyonu arac\u0131l\u0131\u011f\u0131yla Sql Server kullan\u0131laca\u011f\u0131 belirtilmekte ve server ba\u011flant\u0131s\u0131 &#8220;Configuration.GetConnectionString&#8221; komutu ile de &#8220;appsettings.json&#8221; dosyas\u0131nda &#8220;DefaultConnection&#8221; isminde kay\u0131tta tutulan provider ile sa\u011flanmas\u0131 s\u00f6ylenmektedir.<\/p>\n<p>&#8220;appsettings.json&#8221; dosyas\u0131; klasik Asp.NET mimarisindeki &#8220;web.config&#8221; dosyas\u0131na denk olan, Asp.NET Core ile d\u00fcnyam\u0131za giren bir dosyad\u0131r. Proje i\u00e7erisinde varsay\u0131lan olarak gelmeyen &#8220;appsettings.json&#8221; dosyas\u0131n\u0131 &#8220;App Settings File&#8221; isminde aratarak ismini de\u011fi\u015ftirmeksizin direkt olarak eklemeniz ilgili dosyay\u0131 projeye entegre etmeniz i\u00e7in yeterli olacakt\u0131r. &#8220;appsettings.json&#8221; dosyas\u0131n\u0131n i\u00e7eri\u011fide a\u015fa\u011f\u0131daki gibi olacakt\u0131r;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n  &quot;ConnectionStrings&quot;: {\r\n    &quot;DefaultConnection&quot;: &quot;Server=.;Database=ExampleDb;Trusted_Connection=True;Integrated Security=True;&quot;\r\n  }\r\n}\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, &#8220;ConnectionStrings&#8221; \u00f6zelli\u011fi alt\u0131nda tan\u0131mlanan &#8220;DefaultConnection&#8221; \u00f6zelli\u011fi, o anda ba\u011flant\u0131 kuraca\u011f\u0131m\u0131z database bilgisinin provider\u0131n\u0131 tutmaktad\u0131r.<\/p>\n<p>Bu noktaya kadar yapt\u0131\u011f\u0131m\u0131z t\u00fcm \u00e7al\u0131\u015fma migration altyap\u0131s\u0131 i\u00e7in gerekli olan \u00e7o\u011fu hususu bar\u0131nd\u0131rmaktad\u0131r. \u015eimdi migration yap\u0131lar\u0131n\u0131 projeye entegre edebilmek i\u00e7in &#8220;<em>Microsoft.EntityFrameworkCore.Tools.DotNet<\/em>&#8221; k\u00fct\u00fcphanesini projemize eklememiz gerekmektedir. Bu i\u015flem i\u00e7in projeye sa\u011f t\u0131klay\u0131p &#8220;Edit -ProjeAdi-.csproj&#8221; sekmesine t\u0131klay\u0131n\u0131z ve a\u015fa\u011f\u0131da oldu\u011fu gibi ilgili paketi ekleyiniz.<\/p>\n<pre class=\"brush: xml; title: ; notranslate\" title=\"\">\r\n&lt;Project Sdk=&quot;Microsoft.NET.Sdk.Web&quot;&gt;\r\n\r\n  &lt;PropertyGroup&gt;\r\n    &lt;TargetFramework&gt;netcoreapp2.1&lt;\/TargetFramework&gt;\r\n  &lt;\/PropertyGroup&gt;\r\n\r\n  &lt;ItemGroup&gt;\r\n    &lt;Folder Include=&quot;Views\\Shared\\&quot; \/&gt;\r\n    &lt;Folder Include=&quot;wwwroot\\&quot; \/&gt;\r\n  &lt;\/ItemGroup&gt;\r\n\r\n  &lt;ItemGroup&gt;\r\n    &lt;PackageReference Include=&quot;Microsoft.AspNetCore.App&quot; \/&gt;\r\n    &lt;PackageReference Include=&quot;Microsoft.VisualStudio.Web.CodeGeneration.Design&quot; Version=&quot;2.1.1&quot; \/&gt;\r\n    &lt;DotNetCliToolReference Include=&quot;Microsoft.EntityFrameworkCore.Tools.DotNet&quot; Version=&quot;2.0.3&quot; \/&gt;\r\n  &lt;\/ItemGroup&gt;\r\n\r\n&lt;\/Project&gt;\r\n<\/pre>\n<p>E\u011fer ki, projeye entegre etmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z paketin son versiyon bilgisini bilmiyorsan\u0131z <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.Tools.DotNet\" target=\"_blank\" rel=\"noopener\">\u015fu adresten<\/a> bak\u0131p teyit edebilirsiniz.<\/p>\n<h3>Migration Olu\u015fturma\/Ekleme<\/h3>\n<p>T\u00fcm bu i\u015flemleri yapt\u0131ktan sonra art\u0131k projemizde migrations yap\u0131lar\u0131n\u0131 olu\u015fturabiliriz. Bu i\u015flem i\u00e7in projenin dizininde komut sat\u0131r\u0131n\u0131 a\u00e7arak a\u015fa\u011f\u0131daki prototipte olan komutu yazman\u0131z yeterlidir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ndotnet ef migrations add &#x5B;migration ad\u0131]\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9639\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri.png\" alt=\"Asp.NET Core 2 MVC'de Migrations \u0130le Veritaban\u0131 \u0130\u015flemleri\" width=\"842\" height=\"102\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri.png 842w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-300x36.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-768x93.png 768w\" sizes=\"auto, (max-width: 842px) 100vw, 842px\" \/><\/a><br \/>\nBu i\u015flemi yapt\u0131ktan sonra projemize Solution Explorer penceresinden bakarsak e\u011fer &#8220;Migrations&#8221; isminde bir klas\u00f6r\u00fcn eklendi\u011fini g\u00f6rmekteyiz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-9641\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-1.png\" alt=\"Asp.NET Core 2 MVC'de Migrations \u0130le Veritaban\u0131 \u0130\u015flemleri\" width=\"292\" height=\"277\" \/><\/a><br \/>\n\u0130lgili klas\u00f6r i\u00e7erisinde ilk etapta biri migration bir di\u011feri ise &#8220;Startup&#8221; s\u0131n\u0131f\u0131nda DbContext olarak belirtti\u011fimiz s\u0131n\u0131f\u0131n Snapshot s\u0131n\u0131flar\u0131 gelmektedir. Bu s\u0131n\u0131flar i\u00e7erisine s\u0131ras\u0131yla g\u00f6z atarsak e\u011fer;<\/p>\n<p>\u0130lk olarak migration s\u0131n\u0131f\u0131m\u0131z\u0131 inceleyece\u011fiz;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public partial class initial : Migration\r\n    {\r\n        protected override void Up(MigrationBuilder migrationBuilder)\r\n        {\r\n            migrationBuilder.CreateTable(\r\n                name: &quot;Employees&quot;,\r\n                columns: table =&gt; new\r\n                {\r\n                    Id = table.Column&lt;int&gt;(nullable: false)\r\n                        .Annotation(&quot;SqlServer:ValueGenerationStrategy&quot;, SqlServerValueGenerationStrategy.IdentityColumn),\r\n                    Name = table.Column&lt;string&gt;(nullable: true),\r\n                    SurName = table.Column&lt;string&gt;(nullable: true),\r\n                    Age = table.Column&lt;int&gt;(nullable: false)\r\n                },\r\n                constraints: table =&gt;\r\n                {\r\n                    table.PrimaryKey(&quot;PK_Employees&quot;, x =&gt; x.Id);\r\n                });\r\n        }\r\n\r\n        protected override void Down(MigrationBuilder migrationBuilder)\r\n        {\r\n            migrationBuilder.DropTable(\r\n                name: &quot;Employees&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>Olu\u015fturulan migration s\u0131n\u0131f\u0131nda sistem &#8220;Startup&#8221; s\u0131n\u0131f\u0131 i\u00e7erisinde tan\u0131mlanm\u0131\u015f &#8220;DbContext&#8221; s\u0131n\u0131f\u0131 i\u00e7erisinde &#8220;DbSet&lt;T&gt;&#8221; tipinde tablo olarak tan\u0131mlanm\u0131\u015f t\u00fcm s\u0131n\u0131flar\u0131 yakalamakta ve &#8220;Up&#8221; metodu i\u00e7erisinde generate etmektedir. Burada dikkat edilmesi gereken nokta &#8220;Up&#8221; metodu de\u011fi\u015fiklikleri uygulamak i\u00e7in kullan\u0131l\u0131rken, &#8220;Down&#8221; metodu ise yap\u0131lan t\u00fcm de\u011fi\u015fiklikleri geri almak i\u00e7in kullan\u0131lmaktad\u0131r.<\/p>\n<p>Snapshot s\u0131n\u0131f\u0131na g\u00f6z atarsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;DbContext(typeof(DatabaseContext))]\r\n    partial class DatabaseContextModelSnapshot : ModelSnapshot\r\n    {\r\n        protected override void BuildModel(ModelBuilder modelBuilder)\r\n        {\r\n#pragma warning disable 612, 618\r\n            modelBuilder\r\n                .HasAnnotation(&quot;ProductVersion&quot;, &quot;2.1.3-rtm-32065&quot;)\r\n                .HasAnnotation(&quot;Relational:MaxIdentifierLength&quot;, 128)\r\n                .HasAnnotation(&quot;SqlServer:ValueGenerationStrategy&quot;, SqlServerValueGenerationStrategy.IdentityColumn);\r\n\r\n            modelBuilder.Entity(&quot;CoreMigrations.Models.Entities.Employee&quot;, b =&gt;\r\n                {\r\n                    b.Property&lt;int&gt;(&quot;Id&quot;)\r\n                        .ValueGeneratedOnAdd()\r\n                        .HasAnnotation(&quot;SqlServer:ValueGenerationStrategy&quot;, SqlServerValueGenerationStrategy.IdentityColumn);\r\n\r\n                    b.Property&lt;int&gt;(&quot;Age&quot;);\r\n\r\n                    b.Property&lt;string&gt;(&quot;Name&quot;);\r\n\r\n                    b.Property&lt;string&gt;(&quot;SurName&quot;);\r\n\r\n                    b.HasKey(&quot;Id&quot;);\r\n\r\n                    b.ToTable(&quot;Employees&quot;);\r\n                });\r\n#pragma warning restore 612, 618\r\n        }\r\n    }\r\n<\/pre>\n<p>burada model ile ilgili t\u00fcm yap\u0131lar in\u015fa edilmektedir.<\/p>\n<h3>Migrationlar\u0131 Migrate Ederek Veritaban\u0131na Yans\u0131tmak<\/h3>\n<p>Evet&#8230; T\u00fcm altyap\u0131m\u0131z\u0131 kurduk. Migrationlar\u0131m\u0131z\u0131 olu\u015fturduk. \u015eimdi olu\u015fturulan migrationlar\u0131 migrate ederek veritaban\u0131na yans\u0131tal\u0131m. Bu i\u015flem i\u00e7in biri komut sat\u0131r\u0131ndan bir di\u011feride programatik olmak \u00fczere iki farkl\u0131 yol mevcuttur. Bizler her iki yoluda inceleyece\u011fiz;<\/p>\n<p>\u0130lk olarak komut sat\u0131r\u0131nda migrate i\u015flemini g\u00f6relim.<\/p>\n<p>Projemizdeki migrationlar\u0131 migrate edebilmek i\u00e7in komut sat\u0131r\u0131ndan a\u015fa\u011f\u0131daki prototipte bulunan komutu \u00e7al\u0131\u015ft\u0131rmam\u0131z yeterlidir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ndotnet ef database update\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-2.png\" alt=\"Asp.NET Core 2 MVC&#039;de Migrations \u0130le Veritaban\u0131 \u0130\u015flemleri\" width=\"1049\" height=\"552\" class=\"aligncenter size-full wp-image-9651\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-2.png 1049w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-2-300x158.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-2-768x404.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-2-1024x539.png 1024w\" sizes=\"auto, (max-width: 1049px) 100vw, 1049px\" \/><\/a><br \/>\nBu i\u015flemden sonra SQL Server&#8217;a g\u00f6z atarsak e\u011fer a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi veritaban\u0131m\u0131z\u0131n olu\u015fturuldu\u011funu ve i\u00e7erisine ilgili tablonun eklendi\u011fini g\u00f6rece\u011fiz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-3.png\" alt=\"Asp.NET Core 2 MVC&#039;de Migrations \u0130le Veritaban\u0131 \u0130\u015flemleri\" width=\"319\" height=\"466\" class=\"aligncenter size-full wp-image-9653\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-3.png 319w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-3-205x300.png 205w\" sizes=\"auto, (max-width: 319px) 100vw, 319px\" \/><\/a><br \/>\nHatta dikkat ederseniz e\u011fer ilgili tablonun &#8220;Id&#8221; kolonuna otomatik bir \u015fekilde primary key constrainti eklenmekte ve belirtilen t\u00fcm ayarlar kolonlara yans\u0131t\u0131lmaktad\u0131r.<\/p>\n<p>Migrate i\u015fleminin programatik olarak ger\u00e7ekle\u015ftirilmesini istiyorsan\u0131z e\u011fer &#8220;Startup&#8221; s\u0131n\u0131f\u0131 i\u00e7erisindeki &#8220;Configure&#8221; isimli metotta a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmay\u0131 ger\u00e7ekle\u015ftirmemiz yeterli olacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\r\n        {\r\n            if (env.IsDevelopment())\r\n                app.UseDeveloperExceptionPage();\r\n\r\n            app.UseMvcWithDefaultRoute();\r\n            app.UseStaticFiles();\r\n\r\n            using (var serviceScope = app.ApplicationServices.CreateScope())\r\n            {\r\n                \/\/Uygulaman\u0131n kulland\u0131\u011f\u0131 DatabaseContext s\u0131n\u0131f\u0131ndan bir \u00f6rnek al\u0131yoruz.\r\n                DatabaseContext context = serviceScope.ServiceProvider.GetRequiredService&lt;DatabaseContext&gt;();\r\n                \/\/DbContext'i migrate ediyoruz.\r\n                context.Database.Migrate();\r\n            }\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p>Kodumuzu bu \u015fekilde in\u015fa ettikten sonra projeyi derleyip \u00e7al\u0131\u015ft\u0131rman\u0131z ilgili migrationlar\u0131n migrate olmas\u0131 i\u00e7in yeterli olacak ve veritaban\u0131, tablolar vs. yap\u0131lar\u0131 olu\u015fturulup proje o \u015fekilde aya\u011fa kald\u0131r\u0131lacakt\u0131r.<\/p>\n<h3>Entity G\u00fcncelleme Durumlar\u0131<\/h3>\n<p>Migration&#8217;\u0131n olu\u015fturdu\u011fu entity \u00fczerinde bir de\u011fi\u015fiklik meydana geldi\u011fi zaman ilgili de\u011fi\u015fikli\u011fi yakalayacak yeni bir migration eklemek en do\u011frusu olacakt\u0131r. \u00d6rne\u011fin; &#8220;Employee&#8221; s\u0131n\u0131f\u0131na &#8220;Date&#8221; propertysi ekleyerek de\u011fi\u015fiklik yapt\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcnelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Employee\r\n    {\r\n        public int Id { get; set; }\r\n        public string Name { get; set; }\r\n        public string SurName { get; set; }\r\n        public int Age { get; set; }\r\n\r\n        public DateTime Date { get; set; }\r\n    }\r\n<\/pre>\n<p>\u015eimdi bu de\u011fi\u015fikli\u011fi yakalamas\u0131 i\u00e7in yeni bir migration olu\u015ftural\u0131m.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-4.png\" alt=\"Asp.NET Core 2 MVC&#039;de Migrations \u0130le Veritaban\u0131 \u0130\u015flemleri\" width=\"1048\" height=\"72\" class=\"aligncenter size-full wp-image-9662\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-4.png 1048w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-4-300x21.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-4-768x53.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-4-1024x70.png 1024w\" sizes=\"auto, (max-width: 1048px) 100vw, 1048px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2018\/09\/Asp.NET-Core-2-MVCde-Migrations-\u0130le-Veritaban\u0131-\u0130\u015flemleri-5.png\" alt=\"Asp.NET Core 2 MVC&#039;de Migrations \u0130le Veritaban\u0131 \u0130\u015flemleri\" width=\"297\" height=\"226\" class=\"aligncenter size-full wp-image-9664\" \/><\/a><br \/>\nYukar\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcne dikkat ederseniz olu\u015fturdu\u011fumuz migration ilgili klas\u00f6re eklenmi\u015ftir. \u0130\u00e7eri\u011fine g\u00f6z atarsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public partial class EmployeeAddDateProp : Migration\r\n    {\r\n        protected override void Up(MigrationBuilder migrationBuilder)\r\n        {\r\n            migrationBuilder.AddColumn&lt;DateTime&gt;(\r\n                name: &quot;Date&quot;,\r\n                table: &quot;Employees&quot;,\r\n                nullable: false,\r\n                defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));\r\n        }\r\n\r\n        protected override void Down(MigrationBuilder migrationBuilder)\r\n        {\r\n            migrationBuilder.DropColumn(\r\n                name: &quot;Date&quot;,\r\n                table: &quot;Employees&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>g\u00f6rd\u00fc\u011f\u00fcn\u00fcz \u00fczere bu sefer &#8220;Employee&#8221; entitysindeki de\u011fi\u015fiklik yakalanm\u0131\u015ft\u0131r ve bir kolon ekleme i\u015flemi yap\u0131lmaktad\u0131r.<\/p>\n<p>\u015eimdi tek yapmam\u0131z gereken bu migration\u0131 ya komut sat\u0131r\u0131ndan ya da programatik olarak migrate etmemiz gerekmektedir. Bu i\u015flem i\u00e7in \u00f6nceki sat\u0131rlarda ele ald\u0131\u011f\u0131m\u0131z her iki y\u00f6ntemden birini uygularsan\u0131z veritaban\u0131na ilgili de\u011fi\u015fikli\u011fin yans\u0131t\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<h3>Migrationlar\u0131 Geri Almak ya da Belirli Bir Migrationa Geri D\u00f6nmek<\/h3>\n<p>Migrationlar\u0131 geri almak istiyorsan\u0131z tek yapman\u0131z gereken geri d\u00f6nmek istedi\u011finiz migration ad\u0131n\u0131 update komutunun sonuna a\u015fa\u011f\u0131daki gibi belirtmeniz gerekmektedir.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\ndotnet ef database update &#x5B;migration ad\u0131]\r\n<\/pre>\n<p>Bu kal\u0131pta komutu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda aradaki t\u00fcm migration i\u015flemleri geri al\u0131nacak ve veritaban\u0131 belirtilen migration\u0131n ayarlar\u0131na g\u00f6re tasarlanacakt\u0131r.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<\/p>\n<p>\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde Asp.NET Core 2 MVC&#8217;de migration yap\u0131s\u0131n\u0131n nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 inceleyece\u011fiz. \u0130lk olarak migration altyap\u0131s\u0131n\u0131n kurulumunu ger\u00e7ekle\u015ftirecek, ard\u0131ndan migration olu\u015fturacak, s\u00fcre\u00e7te migrationlar \u00fczerinde d\u00fczenleme i\u015flemleri ger\u00e7ekle\u015ftirecek ve t\u00fcm bu i\u015flemlerin neticesinde migration yap\u0131lar\u0131n\u0131n&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":9596,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2656],"tags":[2664,2651,2663,990],"class_list":["post-9624","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core-2-mvc","tag-net-core","tag-asp-net-core-2-mvc","tag-asp-net-core-2-mvc-migrations","tag-migrations"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9624","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=9624"}],"version-history":[{"count":39,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9624\/revisions"}],"predecessor-version":[{"id":9669,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/9624\/revisions\/9669"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/9596"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=9624"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=9624"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=9624"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}