﻿
{"id":24287,"date":"2022-01-22T14:33:06","date_gmt":"2022-01-22T14:33:06","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=24287"},"modified":"2022-01-22T14:33:06","modified_gmt":"2022-01-22T14:33:06","slug":"entity-framework-core-value-converters","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/entity-framework-core-value-converters\/","title":{"rendered":"Entity Framework Core &#8211; Value Converters"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>.NET ile geli\u015ftirilen uygulamalarda olmazsa olmaz diyebilece\u011fimiz ORM(Object Relational Mapping) arac\u0131m\u0131z olan Entity Framework Core, uygulamalar\u0131m\u0131z\u0131 i\u015flevsel a\u00e7\u0131dan her ne kadar veritabanlar\u0131ndan izole bir vaziyete getiriyor olsa da bir yandan da verisel a\u00e7\u0131dan belli ba\u015fl\u0131 de\u011ferlere olan ba\u011f\u0131ml\u0131l\u0131klar\u0131 ortadan kald\u0131rabilme niteli\u011fiyle e\u015fsiz bir hizmet sa\u011flayabiliyor. \u0130\u015fte bu i\u00e7eri\u011fimizde Entity Framework Core&#8217;un bu kabiliyetini sa\u011flayan Value Converters \u00f6zelli\u011fini inceliyor olaca\u011f\u0131z.<\/p>\n<p>Her \u015feyden \u00f6nce direkt olarak <em>de\u011ferlere olan ba\u011f\u0131ml\u0131l\u0131klar<\/em>dan kastedileni izah ederek ba\u015flayal\u0131m. Farz-\u0131 misal, \u015firketinizdeki personel verilerinin depoland\u0131\u011f\u0131 tabloda cinsiyet verileri a\u015fa\u011f\u0131daki gibi tutuluyor olsun.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters.png\" alt=\"Entity Framework Core - Value Converters\" width=\"405\" height=\"132\" class=\"alignleft size-full wp-image-24288\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters.png 405w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-300x98.png 300w\" sizes=\"auto, (max-width: 405px) 100vw, 405px\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere bu tablodaki &#8216;Gender&#8217; kolonundaki verilerden &#8216;M&#8217; olanlar\u0131n erkek(male), &#8216;F&#8217; olanlar\u0131n ise kad\u0131n(female) oldu\u011funu anl\u0131yoruz. Yani bu tabloda, bir personelin cinsiyeti hakk\u0131nda bilgi edinebilmek i\u00e7in &#8216;Gender&#8217; kolonuna bakmal\u0131 ve &#8216;M&#8217; ya da &#8216;F&#8217; de\u011ferlerine g\u00f6re yorumda bulunulmal\u0131d\u0131r. Buradan anla\u015f\u0131lan bir personelin cinsiyet bilgisini \u00f6\u011frenebilmek i\u00e7in &#8216;M&#8217; ya da &#8216;F&#8217; karakterlerine ba\u011f\u0131ml\u0131 bir \u015fekilde hareket edilmelidir diyebiliriz.<\/p>\n<p>\u0130\u015fte de\u011ferlere olan ba\u011f\u0131ml\u0131l\u0131ktan kast\u0131m\u0131z budur! Yani burada &#8216;M&#8217; ya da &#8216;F&#8217; de\u011ferleri yerine ba\u015fka karakterlere, de\u011ferlere, ifadelere ve hatta c\u00fcmlelere yer verilebilir ve y\u00fcklenen anlamlara g\u00f6re cinsiyet durumlar\u0131 e\u015fle\u015ftirilebilirdi. Misal olarak; &#8216;X&#8217; de\u011ferine erkek, &#8216;Y&#8217; de\u011ferine kad\u0131n denebilir ve haliyle b\u00f6yle bir durumda da &#8216;X&#8217; ve &#8216;Y&#8217; de\u011ferlerine ba\u011f\u0131ml\u0131 hareket edilebilirdi.<\/p>\n<p>EF Core, de\u011ferlere olan bu tarz ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netebilmemizi ve hatta ortadan kald\u0131rabilmemizi sa\u011flayabilecek niteli\u011fe sahiptir. Nas\u0131l m\u0131? EF Core ile yap\u0131lan sorgulamalarda salt bir \u015fekilde sorgu \u00e7ekilirse e\u011fer veriler ne ise o \u015fekilde elde edilecektir. Lakin, Value Converters \u00f6zelli\u011fi sayesinde gelecek olan veriler, veritaban\u0131ndan sorguland\u0131ktan sonra farkl\u0131 de\u011ferlere d\u00f6n\u00fc\u015ft\u00fcr\u00fclerek orjinalleriyle ili\u015fkili olabilecek \u015fekilde elde edilebilir. Bu durumu yine \u00f6rneklendirmemiz gerekirse e\u011fer, yukar\u0131daki tabloyu sorgularken cinsiyetlerin &#8216;M&#8217; ya da &#8216;F&#8217; olarak gelmesinden ziyade &#8216;M&#8217; yerine &#8216;Male&#8217;, &#8216;F&#8217; yerine ise &#8216;Female&#8217; de\u011ferlerinin gelmesini sa\u011flayabiliriz. B\u00f6ylece i\u015f mant\u0131\u011f\u0131 s\u00fcre\u00e7leri daha anlaml\u0131 olabilir ve veritaban\u0131ndaki salt de\u011ferlere ba\u011f\u0131ml\u0131 bir \u015fekilde hareket etmek zorunda kal\u0131nmayabilir. <\/p>\n<p>Bu senaryo, sadece veri sorgulamakta de\u011fil ihtiya\u00e7 do\u011frultusunda veri ekleme ve g\u00fcncelleme operasyonlar\u0131nda da ge\u00e7erli olabilmektedir. Yani bizler EF Core ile cinsiyet bilgisi &#8216;Male&#8217; ya da &#8216;Female&#8217; olan personeli veritaban\u0131na eklerken bu veriler yerine Value Converters sayesinde farkl\u0131 de\u011ferler g\u00f6nderebilir ve yine okurken de farkl\u0131 d\u00f6n\u00fc\u015f\u00fcmler neticesinde elde edip, okuyabiliriz.<\/p>\n<p><em>Peki bu i\u015flemi nas\u0131l yap\u0131yoruz?<\/em> gelin inceleyelim&#8230;<\/p>\n<h4>Value Converters Kullan\u0131m\u0131<\/h4>\n<p>EF Core ile Value Converters niteli\u011finin kullan\u0131m\u0131 olduk\u00e7a basittir. Bunun i\u00e7in yap\u0131lmas\u0131 gereken &#8216;DbContext&#8217; s\u0131n\u0131f\u0131 \u00fczerinde <code>override<\/code> edilmi\u015f olan &#8216;OnModelCreating&#8217; metodu i\u00e7erisinde a\u015fa\u011f\u0131daki gibi i\u015flemlerin ger\u00e7ekle\u015ftirilmesidir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass ExampleDbContext : DbContext\r\n{\r\n    public DbSet&lt;Employee&gt; Employees { get; set; }\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.Entity&lt;Employee&gt;()\r\n            .Property(e =&gt; e.Gender)\r\n            .HasConversion(\r\n            e =&gt; e, \/\/Kaydedilirken - Insert | Update\r\n            e =&gt; e == &quot;M&quot; ? &quot;Male&quot; : &quot;Female&quot; \/\/Okunurken - Select\r\n            );\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8216;Employee&#8217; entity&#8217;sinin &#8216;Gender&#8217; property&#8217;si \u00fczerinde \u00e7a\u011fr\u0131lan <code style=\"color:red;\">HasConversion<\/code> fonksiyonu sayesinde value converters devreye sokulmakta ve birinci parametresinde veritaban\u0131na salt de\u011fer kaydedilirken(ki d\u00f6n\u00fc\u015f\u00fcm yaparakta bu i\u015flem ger\u00e7ekle\u015ftirilebilir), ikinci parametresinde i\u015flenerek sorgulama s\u00fcre\u00e7leri i\u00e7in cinsiyet verisi istenilen formata d\u00f6n\u00fc\u015ft\u00fcr\u00fclmektedir.<\/p>\n<p>Haliyle ilgili context \u00fczerinden a\u015fa\u011f\u0131daki gibi veri ekleme operasyonu sonras\u0131nda:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nExampleDbContext context = new();\r\nEmployee e1 = new() { Name = &quot;Gen\u00e7ay Y\u0131ld\u0131z&quot;, Price = 1000, Gender = &quot;M&quot; };\r\nEmployee e2 = new() { Name = &quot;G\u00fcls\u00fcm Yi\u011fit&quot;, Price = 7000, Gender = &quot;F&quot; };\r\nEmployee e3 = new() { Name = &quot;Eren Ko\u015f&quot;, Price = 14000, Gender = &quot;M&quot; };\r\nawait context.Employees.AddRangeAsync(e1, e2, e3);\r\nawait context.SaveChangesAsync();\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-300x98.png\" alt=\"Entity Framework Core - Value Converters\" width=\"300\" height=\"98\" class=\"alignleft size-medium wp-image-24288\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-300x98.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters.png 405w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nyandaki ekran g\u00f6r\u00fcnt\u00fcs\u00fcndeki gibi veriler kaydedilirken, bir yandan da a\u015fa\u011f\u0131daki gibi sorgulan\u0131rlarsa:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nExampleDbContext context = new();\r\nvar employees = await context.Employees.ToListAsync();\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-1-150x150.png\" alt=\"Entity Framework Core - Value Converters\" width=\"150\" height=\"150\" class=\"alignright size-thumbnail wp-image-24316\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-1-150x150.png 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-1-80x80.png 80w\" sizes=\"auto, (max-width: 150px) 100vw, 150px\" \/><\/a><br \/>\nelde edilen veriler yandaki g\u00f6rseldeki gibi gelmektedirler.<\/p>\n<p>Yap\u0131sal olarak bu tarz bir kabiliyetin ne gibi getirileri olabilece\u011fini tart\u0131\u015fmak g\u00f6receli olsa da, eldeki verilerden anlaml\u0131 ve okunabilir bir sonu\u00e7 \u00e7\u0131karabilmemizi sa\u011flayaca\u011f\u0131 a\u015fikard\u0131r. Bunu en iyi \u015fekilde enum t\u00fcr\u00fcnden verilerde g\u00f6zlemleyebilmekteyiz.<\/p>\n<p>A\u015fa\u011f\u0131daki &#8216;Soldier&#8217; s\u0131n\u0131f\u0131n\u0131 incelerseniz e\u011fer r\u00fctbeyi ifade eden &#8216;Rank&#8217; property&#8217;si bir enum olarak tasarlanm\u0131\u015ft\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Soldier\r\n{\r\n    public int Id { get; set; }\r\n    public string Name { get; set; }\r\n    public Rank Rank { get; set; }\r\n}\r\n\r\nenum Rank\r\n{\r\n    Lieutenant,\r\n    Captain,\r\n    Colonel\r\n}\r\n<\/pre>\n<\/div>\n<p>\u0130lgili t\u00fcr \u00fczerinde a\u015fa\u011f\u0131daki gibi insert i\u015flemi ger\u00e7ekle\u015ftirdi\u011fimizde:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nExampleDbContext context = new();\r\nSoldier s1 = new() { Name = &quot;Ahmet \u015eafak&quot;, Rank = Rank.Captain };\r\nSoldier s2 = new() { Name = &quot;Mehmet \u015eafak&quot;, Rank = Rank.Lieutenant };\r\nSoldier s3 = new() { Name = &quot;R\u0131fk\u0131 \u015eafak&quot;, Rank = Rank.Colonel };\r\nawait context.Soldiers.AddRangeAsync(s1, s2, s3);\r\nawait context.SaveChangesAsync();\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-2.png\" alt=\"Entity Framework Core - Value Converters\" width=\"234\" height=\"113\" class=\"alignleft size-full wp-image-24323\" \/><\/a>yandaki g\u00f6rseldeki gibi veriler kaydedilecektir. Dikkat ederseniz, veritaban\u0131nda enum de\u011ferlere kar\u015f\u0131l\u0131k olarak integer t\u00fcrde de\u011ferler tutulmaktad\u0131r. Eee bu zaten enum de\u011ferlerin do\u011fas\u0131 itibariyle gayet normaldir. Ki enum de\u011ferler, belirli ifadeleri tam say\u0131 kar\u015f\u0131l\u0131klar\u0131nda tutmam\u0131z\u0131 sa\u011flayan de\u011ferlerdir. Bundan dolay\u0131 EF Core, enum bir property&#8217;i direkt olarak integer kabul etmekte ve o \u015fekilde migrate etmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-3.png\" alt=\"Entity Framework Core - Value Converters\" width=\"459\" height=\"323\" class=\"aligncenter size-full wp-image-24326\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-3.png 459w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-3-300x211.png 300w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/a>\u0130\u015fte bizler Value Converters sayesinde bu kabule m\u00fcdahale edebilmekte ve bir property enum dahi olsa farkl\u0131 t\u00fcrlerde kay\u0131t i\u015flemini ger\u00e7ekle\u015ftirebilmekteyiz.<\/p>\n<p>Misal olarak, a\u015fa\u011f\u0131daki kod blo\u011funu incelerseniz e\u011fer:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass ExampleDbContext : DbContext\r\n{\r\n    public DbSet&lt;Soldier&gt; Soldiers { get; set; }\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.Entity&lt;Soldier&gt;()\r\n            .Property(e =&gt; e.Rank)\r\n            .HasConversion(\r\n                v =&gt; v.ToString(),\r\n                v =&gt; (Rank)Enum.Parse(typeof(Rank), v)\r\n            );\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;Rank&#8217; property&#8217;sinde kaydedilecek veri g\u00f6nderilen enum&#8217;\u0131n string de\u011feriyken, sorgulama s\u00fcrecinde elde edilecek hali ise enum t\u00fcr\u00fcne kar\u015f\u0131l\u0131k olan halidir. Hal b\u00f6yleyken \u00fcretilen migration&#8217;a g\u00f6z atarsak e\u011fer art\u0131k ilgili kolon t\u00fcr\u00fcn\u00fcn integer de\u011fil string olarak ayarland\u0131\u011f\u0131n\u0131 g\u00f6rebiliriz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-4.png\" alt=\"Entity Framework Core - Value Converters\" width=\"399\" height=\"174\" class=\"aligncenter size-full wp-image-24329\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-4.png 399w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-4-300x131.png 300w\" sizes=\"auto, (max-width: 399px) 100vw, 399px\" \/><\/a>Ve veri eklendi\u011finde ilgili kolonun a\u015fa\u011f\u0131daki gibi metinsel olarak kaydedildi\u011fini g\u00f6zlemlemekteyiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-5.png\" alt=\"Entity Framework Core - Value Converters\" width=\"263\" height=\"103\" class=\"aligncenter size-full wp-image-24331\" \/><\/a>Nihayetinde kaydedilen verilerin bu hali bir \u00f6nceki say\u0131sal halinden daha okunakl\u0131 ve anlaml\u0131d\u0131r diyebiliriz. \u0130\u015fte bu ve buna benzer ama\u00e7larla value converter&#8217;lar kullan\u0131labilmektedir.<\/p>\n<h4>ValueConverter S\u0131n\u0131f\u0131<\/h4>\n<p>Value Converter i\u015flemi i\u00e7in \u00f6z\u00fcnde kullan\u0131lan s\u0131n\u0131f <code>ValueConverter<\/code> s\u0131n\u0131f\u0131d\u0131r. Yani yukar\u0131daki i\u015flemi a\u015fa\u011f\u0131daki gibi ilgili s\u0131n\u0131fla da ger\u00e7ekle\u015ftirebilirdik:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        ValueConverter&lt;Rank, string&gt; rankConverter = new(\r\n                v =&gt; v.ToString(),\r\n                v =&gt; (Rank)Enum.Parse(typeof(Rank), v)\r\n            );\r\n\r\n        modelBuilder.Entity&lt;Soldier&gt;()\r\n            .Property(e =&gt; e.Rank)\r\n            .HasConversion(rankConverter);\r\n    }\r\n    .\r\n    .\r\n    .\r\n<\/pre>\n<\/div>\n<p>Bu \u015fekilde bir kullan\u0131mdan ziyade, <code>ValueConverter<\/code> s\u0131n\u0131f\u0131ndan t\u00fcreyen ve direkt verisel bazl\u0131 convert i\u015flemine odaklanm\u0131\u015f bir s\u0131n\u0131f \u00fcretilmesi daha kullan\u0131\u015fl\u0131 olacakt\u0131r kanaatindeyim.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass RankConverter : ValueConverter&lt;Rank, string&gt;\r\n{\r\n    public RankConverter()\r\n        : base(\r\n                v =&gt; v.ToString(),\r\n                v =&gt; (Rank)Enum.Parse(typeof(Rank), v)\r\n              )\r\n    { }\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.Entity&lt;Soldier&gt;()\r\n            .Property(e =&gt; e.Rank)\r\n            .HasConversion&lt;RankConverter&gt;();\r\n    }\r\n    .\r\n    .\r\n    .\r\n<\/pre>\n<\/div>\n<h4>Built-in Converters Yap\u0131lar\u0131<\/h4>\n<p>EF Core basit d\u00f6n\u00fc\u015f\u00fcmler i\u00e7in kendi b\u00fcnyesinde yerle\u015fik convert s\u0131n\u0131flar\u0131 bar\u0131nd\u0131rmaktad\u0131r. Misal olarak boolean t\u00fcrde &#8216;true&#8217; ya da &#8216;false&#8217; \u015feklinde tutulan bir de\u011feri say\u0131sal olarak &#8216;0&#8217; ya da &#8216;1&#8217;e veya &#8216;Yes&#8217; ya da &#8216;No&#8217; gibi string de\u011ferlere d\u00f6n\u00fc\u015ft\u00fcrmemizi sa\u011flayan haz\u0131r converter&#8217;lardan bahsediyoruz. \u015eimdi bu converter&#8217;lar\u0131 \u00f6rneklendirebilmek i\u00e7in a\u015fa\u011f\u0131daki modelden yola \u00e7\u0131kal\u0131m:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Person\r\n{\r\n    public int Id { get; set; }\r\n    public string Name { get; set; }\r\n    public bool Married { get; set; }\r\n}\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-6-300x209.png\" alt=\"Entity Framework Core - Value Converters\" width=\"300\" height=\"209\" class=\"alignright size-medium wp-image-24341\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-6-300x209.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-6.png 561w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>&#8216;Person&#8217; modelini migrate etti\u011fimizde yandaki g\u00f6rselden de g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;Married&#8217; kolonu &#8216;bit&#8217; t\u00fcr\u00fcnde ayarlanmaktad\u0131r. Bizler istek ve ihtiya\u00e7 do\u011frultusunda bu de\u011feri string, char ya da integer t\u00fcr\u00fcnde tutabiliriz. \u0130\u015fte bunun gibi primitive t\u00fcrlere \u00f6zel basit d\u00f6n\u00fc\u015f\u00fcmler i\u00e7in <code>BoolToStringConverter<\/code>, <code>BoolToZeroOneConverter<\/code> ve <code>BoolToStringConverter<\/code> gibi tonca converter t\u00fcrleri mevcuttur. Bizler burada k\u0131smi birka\u00e7 \u00f6rneklendirme yap\u0131p konuyu sonland\u0131raca\u011f\u0131z.<\/p>\n<ul>\n<li><em>1. &#8211; ilgili t\u00fcr\u00fcn integer olarak tutulmas\u0131 i\u00e7in :<\/em><br \/>\nBu i\u015flem i\u00e7in a\u015fa\u011f\u0131daki gibi<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.Entity&lt;Person&gt;()\r\n            .Property(p =&gt; p.Married)\r\n            .HasConversion&lt;int&gt;();\r\n    }\r\n    .\r\n    .\r\n    .\r\n<\/pre>\n<\/div>\n<p>ya da<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.Entity&lt;Person&gt;()\r\n            .Property(p =&gt; p.Married)\r\n            .HasConversion&lt;BoolToZeroOneConverter&lt;int&gt;&gt;();\r\n    }\r\n    .\r\n    .\r\n    .\r\n<\/pre>\n<\/div>\n<p><code>BoolToZeroOneConverter<\/code> s\u0131n\u0131f\u0131 e\u015fli\u011finde \u00e7al\u0131\u015fma yap\u0131labilir.\n<\/li>\n<li><em>2. &#8211; ilgili t\u00fcr\u00fcn string olarak tutulmas\u0131 i\u00e7in :<\/em><br \/>\nBu i\u015flem i\u00e7in ise <code>BoolToStringConverter<\/code> s\u0131n\u0131f\u0131 a\u015fa\u011f\u0131daki gibi kullan\u0131labilir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        BoolToStringConverter marriedConverter = new(&quot;Bekar&quot;, &quot;Evli&quot;);\r\n\r\n        modelBuilder.Entity&lt;Person&gt;()\r\n            .Property(p =&gt; p.Married)\r\n            .HasConversion(marriedConverter);\r\n    }\r\n    .\r\n    .\r\n    .\r\n<\/pre>\n<\/div>\n<\/li>\n<li><em>3. &#8211; ilgili t\u00fcr\u00fcn char olarak tutulmas\u0131 i\u00e7in :<\/em><br \/>\nBu i\u015flem i\u00e7in de <code>BoolToTwoValuesConverter<\/code> t\u00fcr\u00fcnden converter kullan\u0131labilir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        BoolToTwoValuesConverter&lt;char&gt; marriedConverter = new('N', 'Y');\r\n\r\n        modelBuilder.Entity&lt;Person&gt;()\r\n            .Property(p =&gt; p.Married)\r\n            .HasConversion(marriedConverter);\r\n    }\r\n    .\r\n    .\r\n    .\r\n<\/pre>\n<\/div>\n<\/li>\n<\/ul>\n<p>Di\u011fer t\u00fcm built-in converter s\u0131n\u0131flar\u0131n\u0131 incelemek istiyorsan\u0131z <a href=\"https:\/\/github.com\/dotnet\/efcore\/find\/main\" rel=\"noopener\" target=\"_blank\">github<\/a> \u00fczerinden a\u015fa\u011f\u0131daki g\u00f6rseldeki gibi &#8216;ValueConversion\/Converter&#8217; de\u011ferleri e\u015fli\u011finde arama yapabilir ve mevcut olan s\u0131n\u0131flara eri\u015fip, inceleyebilirsiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-7-235x300.png\" alt=\"Entity Framework Core - Value Converters\" width=\"235\" height=\"300\" class=\"aligncenter size-medium wp-image-24348\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-7-235x300.png 235w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-7.png 485w\" sizes=\"auto, (max-width: 235px) 100vw, 235px\" \/><\/a><\/p>\n<h4>\u0130lkel Koleksiyonlar\u0131n(Collections of Primitives) Serilizasyonu<\/h4>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Post\r\n{\r\n    public int Id { get; set; }\r\n    public string Title { get; set; }\r\n    public string? Content { get; set; }\r\n\r\n    public ICollection&lt;string&gt; Tags { get; set; } = new List&lt;string&gt;();\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki gibi i\u00e7erisinde ilkel t\u00fcrlerden olu\u015fturulmu\u015f koleksiyonlar\u0131 bar\u0131nd\u0131ran modelleri migrate etmeye \u00e7al\u0131\u015f\u0131p a\u015fa\u011f\u0131daki hatay\u0131 tan\u0131mayan yoktur san\u0131r\u0131m \ud83d\ude42<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-8.png\" alt=\"Entity Framework Core - Value Converters\" width=\"891\" height=\"65\" class=\"aligncenter size-full wp-image-24351\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-8.png 891w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-8-300x22.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-8-768x56.png 768w\" sizes=\"auto, (max-width: 891px) 100vw, 891px\" \/><\/a>Hatan\u0131n metinsel hali;<br \/>\n<em style=\"font-size:12px;color:red;\">The property &#8216;Post.Tags&#8217; could not be mapped because it is of type &#8216;ICollection<string>&#8216;, which is not a supported primitive type or a valid entity type. Either explicitly map this property, or ignore it using the &#8216;[NotMapped]&#8217; attribute or by using &#8216;EntityTypeBuilder.Ignore&#8217; in &#8216;OnModelCreating&#8217;.<\/em><\/p>\n<p>Haliyle bu tarz veri yap\u0131lar\u0131nda value converter yap\u0131lanmalar\u0131 muazzam i\u015f g\u00f6rmekte ve ilkel koleksiyonlar\u0131 normal metinsel de\u011fere d\u00f6n\u00fc\u015ft\u00fcrmemize f\u0131rsat verip, sorgulama s\u00fcre\u00e7lerinde yine koleksiyon olarak elde edilmelerine imkan vermektedirler. \u015e\u00f6yle ki;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.Entity&lt;Post&gt;()\r\n            .Property(p =&gt; p.Tags)\r\n            .HasConversion(\r\n                v =&gt; JsonSerializer.Serialize(v, (JsonSerializerOptions)null),\r\n                v =&gt; JsonSerializer.Deserialize&lt;List&lt;string&gt;&gt;(v, (JsonSerializerOptions)null)\r\n            );\r\n    }\r\n    .\r\n    .\r\n    .\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki convertion operasyonunu incelerseniz, ilkel koleksiyon t\u00fcr\u00fcnden olan kolon json&#8217;a serilize edilerek sonras\u0131nda da okuma s\u00fcrecinde deserilize&#8217;ye tabi tutulup elde edilmektedir. Tabi burada sizler json t\u00fcr\u00fcnden ziyade daha farkl\u0131 formatlarda serilizasyon ger\u00e7ekle\u015ftirebilirsiniz.<\/p>\n<p>Haliyle bu vaziyette a\u015fa\u011f\u0131daki gibi veri eklendi\u011finde:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nPost p1 = new() { Title = &quot;Post 1&quot;, Tags = { &quot;A&quot;, &quot;B&quot;, &quot;C&quot;, &quot;D&quot;, &quot;E&quot;, &quot;F&quot; } };\r\nawait context.Posts.AddAsync(p1);\r\nawait context.SaveChangesAsync();\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-9.png\" alt=\"Entity Framework Core - Value Converters\" width=\"440\" height=\"65\" class=\"aligncenter size-full wp-image-24356\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-9.png 440w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-9-300x44.png 300w\" sizes=\"auto, (max-width: 440px) 100vw, 440px\" \/><\/a>\u015feklinde kaydedilecek ve yine a\u015fa\u011f\u0131daki gibi sorgulama ger\u00e7ekle\u015ftirildi\u011finde:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nExampleDbContext context = new();\r\nvar posts = await context.Posts.ToListAsync();\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-10.png\" alt=\"Entity Framework Core - Value Converters\" width=\"452\" height=\"229\" class=\"aligncenter size-full wp-image-24357\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-10.png 452w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-10-300x152.png 300w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><\/a>\u015feklinde veriler koleksiyon olarak elde ediliyor olacakt\u0131r.<\/p>\n<h4>.NET 6 &#8211; Value Converter For Nullable Fields<\/h4>\n<p>.NET 6&#8217;dan \u00f6nce value converter&#8217;lar da null\/bo\u015f de\u011ferlerin d\u00f6n\u00fc\u015f\u00fcm\u00fc desteklenmemekteydi. .NET 6 ile art\u0131k null\/bo\u015f de\u011ferler de d\u00f6n\u00fc\u015f\u00fcm s\u00fcre\u00e7lerinde kullan\u0131labilmektedir.<br \/>\n\u015e\u00f6yle ki;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Post\r\n{\r\n    public int Id { get; set; }\r\n    public string Title { get; set; }\r\n    public string? Content { get; set; }\r\n    public PostType? PostType { get; set; }\r\n    public ICollection&lt;string&gt; Tags { get; set; } = new List&lt;string&gt;();\r\n}\r\n\r\nenum PostType\r\n{\r\n    Talk,\r\n    Side,\r\n    Citation,\r\n    Unknown\r\n}\r\n<\/pre>\n<\/div>\n<p>yukar\u0131daki modelde &#8216;PostType&#8217; t\u00fcr\u00fcnde tan\u0131mlanm\u0131\u015f olan &#8216;PostType&#8217; kolonunun null olma durumuna kar\u015f\u0131 a\u015fa\u011f\u0131daki converter \u00fcretilmi\u015ftir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass PostTypeConverter : ValueConverter&lt;PostType, string&gt;\r\n{\r\n    public PostTypeConverter()\r\n        : base(\r\n                v =&gt; v == PostType.Unknown ? null : v.ToString(),\r\n                v =&gt; v == null ? PostType.Unknown : Enum.Parse&lt;PostType&gt;(v),\r\n                convertsNulls: true\r\n             )\r\n    { }\r\n}\r\n<\/pre>\n<\/div>\n<p>Burada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere null durum hesaba kat\u0131larak d\u00f6n\u00fc\u015f\u00fcm s\u00fcrecinde gerekli operasyon \u00e7ekilmektedir. Tabi t\u00fcm bunlar\u0131 yapabilmek i\u00e7in &#8216;convertsNulls&#8217; parametresinin &#8216;true&#8217; de\u011ferine sahip olmas\u0131 gerekmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-11.png\" alt=\"Entity Framework Core - Value Converters\" width=\"314\" height=\"146\" class=\"aligncenter size-full wp-image-24360\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-11.png 314w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-11-300x139.png 300w\" sizes=\"auto, (max-width: 314px) 100vw, 314px\" \/><\/a>Haliyle yukar\u0131daki gibi &#8216;PostType&#8217;\u0131 &#8216;Unknown&#8217; olan bir veriyi ekledi\u011fimizde<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-12.png\" alt=\"Entity Framework Core - Value Converters\" width=\"500\" height=\"65\" class=\"aligncenter size-full wp-image-24361\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-12.png 500w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-12-300x39.png 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a>g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere ilgili kolona null de\u011ferini atamaktad\u0131r. Benzer mant\u0131kla sorgulama ger\u00e7ekle\u015ftirdi\u011fimizde ise<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-13.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-13.png\" alt=\"Entity Framework Core - Value Converters\" width=\"326\" height=\"156\" class=\"aligncenter size-full wp-image-24362\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-13.png 326w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/01\/Entity-Framework-Core-Value-Converters-13-300x144.png 300w\" sizes=\"auto, (max-width: 326px) 100vw, 326px\" \/><\/a> ilgili kolon &#8216;Unknown&#8217; olarak gelmektedir.<\/p>\n<p>\u0130\u015fte bu kadar \ud83d\ude42<\/p>\n<p>Nihai olarak,<br \/>\nEF Core bu davran\u0131\u015f\u0131 sayesinde daha \u015feffaf halde \u00e7al\u0131\u015fabilmemizi sa\u011flamakla beraber, kendi g\u00fcc\u00fcne de g\u00fc\u00e7 katmaktad\u0131r \ud83d\ude42<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\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, .NET ile geli\u015ftirilen uygulamalarda olmazsa olmaz diyebilece\u011fimiz ORM(Object Relational Mapping) arac\u0131m\u0131z olan Entity Framework Core, uygulamalar\u0131m\u0131z\u0131 i\u015flevsel a\u00e7\u0131dan her ne kadar veritabanlar\u0131ndan izole bir vaziyete getiriyor olsa da bir yandan da verisel a\u00e7\u0131dan&#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":11538,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2914],"tags":[4507,4511,963,2850,4508,4510,4513,4512,4509],"class_list":["post-24287","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entity-framework-core","tag-ef-core-6","tag-ef-core-value-converters","tag-entity-framework","tag-entity-framework-core","tag-entity-framework-core-6","tag-entity-framework-core-value-converters","tag-object-relational-mapping","tag-orm","tag-value-converters"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24287","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=24287"}],"version-history":[{"count":65,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24287\/revisions"}],"predecessor-version":[{"id":24367,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/24287\/revisions\/24367"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/11538"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=24287"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=24287"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=24287"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}