﻿
{"id":25647,"date":"2022-10-02T02:48:37","date_gmt":"2022-10-02T02:48:37","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=25647"},"modified":"2022-10-02T02:50:29","modified_gmt":"2022-10-02T02:50:29","slug":"entity-framework-core-7-table-per-concrete-type-tpc-davranisi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/entity-framework-core-7-table-per-concrete-type-tpc-davranisi\/","title":{"rendered":"Entity Framework Core 7 &#8211; Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde EF Core 7 ile gelecek olan <em>Table Per Concrete Type(TPC)<\/em> davran\u0131\u015f modellemesini inceliyor olaca\u011f\u0131z.<\/p>\n<h4>Table Per Concrete Type (TPC) Nedir?<\/h4>\n<p><em>Table Per Concrete Type<\/em> modellemesinin ne oldu\u011funu ortaya koyabilmek i\u00e7in \u00f6ncelikle <a href=\"https:\/\/www.gencayyildiz.com\/blog\/entity-framework-core-kalitimsal-durumlardaki-table-per-typetpt-ve-table-per-hierarchytph-davranis-modellemeleri\/\" rel=\"noopener\" target=\"_blank\">Table Per Type (TPT)<\/a> ve <a href=\"https:\/\/www.gencayyildiz.com\/blog\/entity-framework-core-kalitimsal-durumlardaki-table-per-typetpt-ve-table-per-hierarchytph-davranis-modellemeleri\/\" rel=\"noopener\" target=\"_blank\">Table Per Hierarchy (TPH)<\/a> davran\u0131\u015f modellemelerini hat\u0131rlayarak ba\u015flayal\u0131m.<\/p>\n<p><em style=\"color:red;\">TPT<\/em>, merkezi bir tabloyu temsil edecek olan bir s\u0131n\u0131f ile kal\u0131t\u0131msal olarak ili\u015fkide olan entity s\u0131n\u0131flar\u0131n\u0131n her birine kar\u015f\u0131l\u0131k bir tablonun generate edilmesini sa\u011flayan ve bunlar aras\u0131nda birebir ili\u015fki kuran kal\u0131t\u0131msal davran\u0131\u015f modellemesidir. Yani anlayaca\u011f\u0131n\u0131z, \u00f6z\u00fcnde hiyerar\u015fideki her s\u0131n\u0131fa kar\u015f\u0131l\u0131k tablo olu\u015fturmakta ve olu\u015fturulan bir \u00fcst s\u0131n\u0131fla birebir ili\u015fki sa\u011flamaktad\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nabstract public class ApplicationUser\r\n{\r\n    public int Id { get; set; }\r\n    public string Name { get; set; }\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nabstract public class Student : ApplicationUser\r\n{\r\n    public string School { get; set; }\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\npublic class PostGraduate : Student\r\n{\r\n    public string Section { get; set; }\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\npublic class Teacher : ApplicationUser\r\n{\r\n    public string Branch { get; set; }\r\n}\r\n<\/pre>\n<\/div>\n<p>\u015feklinde kal\u0131t\u0131msal olarak tasarlanm\u0131\u015f olan entity&#8217;leri ele al\u0131rsak e\u011fer bunlar\u0131n context \u00fczerinde a\u015fa\u011f\u0131daki gibi konfig\u00fcre edilmeleri neticesinde<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass ApplicationDbContext : DbContext\r\n{\r\n    public DbSet&lt;ApplicationUser&gt; ApplicationUsers { get; set; }\r\n    public DbSet&lt;Student&gt; Students { get; set; }\r\n    public DbSet&lt;PostGraduate&gt; PostGraduates { get; set; }\r\n    public DbSet&lt;Teacher&gt; Teachers { get; set; }\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.Entity&lt;Student&gt;().ToTable(&quot;StudentsUsers&quot;);\r\n        modelBuilder.Entity&lt;PostGraduate&gt;().ToTable(&quot;PostGraduateUsers&quot;);\r\n        modelBuilder.Entity&lt;Teacher&gt;().ToTable(&quot;TeacherUsers&quot;);\r\n    }\r\n    .\r\n    .\r\n    .\r\n}\r\n<\/pre>\n<\/div>\n<p>veritaban\u0131na yans\u0131malar\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"531\" height=\"419\" class=\"aligncenter size-full wp-image-25651\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi.png 531w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-300x237.png 300w\" sizes=\"auto, (max-width: 531px) 100vw, 531px\" \/><\/a>Dikkat ederseniz e\u011fer &#8216;Student&#8217; ve &#8216;Teacher&#8217; entity&#8217;leri &#8216;ApplicationUser&#8217; s\u0131n\u0131f\u0131ndan, &#8216;PostGraduate&#8217; entity&#8217;si ise &#8216;Student&#8217; s\u0131n\u0131f\u0131ndan kal\u0131t\u0131m ald\u0131\u011f\u0131ndan dolay\u0131 netice itibariyle her bir s\u0131n\u0131fa kar\u015f\u0131l\u0131k olu\u015fturulan tablo \u00fcst s\u0131n\u0131f\u0131n tablosuna birebir bir ili\u015fkide olu\u015fturulmu\u015f vaziyettedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nawait context.PostGraduates.AddAsync(new() { Name = &quot;Gen\u00e7ay&quot;, School = &quot;Aksaray \u00dcni.&quot;, Section = &quot;Y\u00f6netim Bili\u015fim Sistemleri&quot; });\r\nawait context.PostGraduates.AddAsync(new() { Name = &quot;Okan&quot;, School = &quot;Ankara \u00dcni.&quot;, Section = &quot;Matematik&quot; });\r\nawait context.PostGraduates.AddAsync(new() { Name = &quot;Rak\u0131f&quot;, School = &quot;ODT\u00dc&quot;, Section = &quot;Felsefe&quot; });\r\nawait context.Teachers.AddAsync(new() { Name = &quot;B\u00fclent&quot;, Branch = &quot;Matematik&quot; });\r\n\r\nawait context.SaveChangesAsync();\r\n<\/pre>\n<\/div>\n<p>Ve bu tasar\u0131mda yukar\u0131daki gibi herhangi bir entity \u00fczerinden kay\u0131t girildi\u011fi taktirde t\u00fcm veriler kendisine kar\u015f\u0131l\u0131k tabloya gelecek \u015fekilde a\u015fa\u011f\u0131daki g\u00f6rseldeki gibi ili\u015fkisel olarak eklenecektir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-1.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"186\" height=\"363\" class=\"aligncenter size-full wp-image-25652\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-1.png 186w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-1-154x300.png 154w\" sizes=\"auto, (max-width: 186px) 100vw, 186px\" \/><\/a><\/p>\n<p><em style=\"color:red;\">TPH<\/em> ise hiyerar\u015fideki t\u00fcm entity&#8217;ler i\u00e7in tek bir tablo olu\u015fturmakta ve bunlar aras\u0131ndaki ayr\u0131m i\u00e7in bir <code>Discriminator<\/code> kolonu kullanmaktad\u0131r.<\/p>\n<p>Yukar\u0131daki \u00f6rnekte sunulan ayn\u0131 entity&#8217;leri context \u00fczerinde herhangi bir konfig\u00fcrasyona tabi tutmadan direkt migrate edersek e\u011fer a\u015fa\u011f\u0131daki gibi beklenen tablonun in\u015fa edildi\u011fini g\u00f6rece\u011fiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-2.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"357\" height=\"195\" class=\"aligncenter size-full wp-image-25654\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-2.png 357w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-2-300x164.png 300w\" sizes=\"auto, (max-width: 357px) 100vw, 357px\" \/><\/a>Ve ayn\u0131 de\u011ferleri bu tasar\u0131mda insert etmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki gibi davran\u0131\u015f sergilendi\u011fini g\u00f6zlemleyece\u011fiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-3.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"465\" height=\"95\" class=\"aligncenter size-full wp-image-25656\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-3.png 465w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-3-300x61.png 300w\" sizes=\"auto, (max-width: 465px) 100vw, 465px\" \/><\/a><br \/>\n\u015eimdi <em style=\"color:red;\">TPT<\/em> ve <em style=\"color:red;\">TPH<\/em> davran\u0131\u015f modellemelerini hat\u0131rlad\u0131\u011f\u0131m\u0131za g\u00f6re art\u0131k <em style=\"color:red;\">TPC<\/em> davran\u0131\u015f\u0131n\u0131n ne oldu\u011funa odaklanabiliriz.<\/p>\n<p><em style=\"color:red;\">TPC<\/em>&#8216;ye, <em style=\"color:red;\">TPT<\/em> stratejisine benzeyen lakin genel olarak performansl\u0131 davran\u0131\u015f\u0131n\u0131 sergileyen versiyonudur diyebiliriz. <em style=\"color:red;\">TPT<\/em>, kal\u0131t\u0131msal hiyerar\u015fideki t\u00fcm t\u00fcrler i\u00e7in tablo olu\u015ftururken <em style=\"color:red;\">TPC<\/em> sade ve sadece concrete yani somut s\u0131n\u0131flar i\u00e7in tablo olu\u015fturmaktad\u0131r. Burada \u00f6rne\u011fimize bakarsan\u0131z e\u011fer &#8216;ApplicationUser&#8217; ve &#8216;Student&#8217; abstract class olduklar\u0131ndan dolay\u0131 <em style=\"color:red;\">TPC<\/em>&#8216;de bunlara kar\u015f\u0131l\u0131k bir tablo \u00fcretilmeyecek dolay\u0131s\u0131yla migrate neticesinde \u00fcretilen tablo yap\u0131lanmas\u0131 a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-4.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"1416\" height=\"366\" class=\"aligncenter size-full wp-image-25659\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-4.png 1416w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-4-300x78.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-4-1024x265.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-4-768x199.png 768w\" sizes=\"auto, (max-width: 1416px) 100vw, 1416px\" \/><\/a>Burada dikkat ederseniz e\u011fer abstract class olan base t\u00fcrler i\u00e7erisindeki member&#8217;lar ilgili tablolara fiziksel olarak eklenmi\u015ftir.<\/p>\n<p><strong>Peki, TPC&#8217;nin yap\u0131land\u0131rmas\u0131n\u0131 nas\u0131l sa\u011flayaca\u011f\u0131z?<\/strong> diye sorarsan\u0131z e\u011fer bunun i\u00e7in a\u015fa\u011f\u0131daki gibi bir konfig\u00fcrasyon yeterli olacakt\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass ApplicationDbContext : DbContext\r\n{\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.Entity&lt;ApplicationUser&gt;().UseTpcMappingStrategy();\r\n        modelBuilder.Entity&lt;Student&gt;().UseTpcMappingStrategy();\r\n    }\r\n    .\r\n    .\r\n    .\r\n}\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code style=\"color:purple;\">UseTpcMappingStrategy<\/code> metodu sayesinde bildirimde bulunulan entity&#8217;nin davran\u0131\u015f\u0131n\u0131 <em style=\"color:red;\">TPC<\/em> olarak yap\u0131land\u0131rabiliyoruz. Burada bir tek <em style=\"color:red;\">TPC<\/em> i\u00e7in de\u011fil <code style=\"color:purple;\">UseTphMappingStrategy<\/code> ve <code style=\"color:purple;\">UseTptMappingStrategy<\/code> fonksiyonlar\u0131 arac\u0131l\u0131\u011f\u0131yla di\u011fer davran\u0131\u015flar i\u00e7in de yap\u0131land\u0131rmalar\u0131 ger\u00e7ekle\u015ftirebiliyoruz. <span style=\"font-size:12px;\">(<em style=\"color:red;\">TPH<\/em>&#8216;\u0131n varsay\u0131lan strateji oldu\u011funu unutmay\u0131n! Ekstradan bir konfig\u00fcrasyon gerektirmez.)<\/span><\/p>\n<h4>TPC&#8217;de Primary Key Problemi<\/h4>\n<p>\u015eimdi <em style=\"color:red;\">TPC<\/em> davran\u0131\u015f\u0131n\u0131n s\u00f6z konusu oldu\u011fu durumda yukar\u0131daki sat\u0131rlarda \u00f6rnek olarak vermi\u015f oldu\u011fumuz insert i\u015flemini uygularsak e\u011fer a\u015fa\u011f\u0131daki gibi hatayla kar\u015f\u0131la\u015faca\u011f\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-5.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"1156\" height=\"191\" class=\"aligncenter size-full wp-image-25661\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-5.png 1156w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-5-300x50.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-5-1024x169.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-5-768x127.png 768w\" sizes=\"auto, (max-width: 1156px) 100vw, 1156px\" \/><\/a>Normalde <em style=\"color:red;\">TPH<\/em> stratejisinde \u00e7al\u0131\u015f\u0131yor olsayd\u0131k hangi entity olursa olsun her kay\u0131t tek bir sat\u0131r olarak temsil edilece\u011finden dolay\u0131 primary key ile ilgili bir problem s\u00f6z konusu olmayacakt\u0131. Ayn\u0131 \u015fekilde <em style=\"color:red;\">TPT<\/em> stratejisinde de eklenen kay\u0131t t\u00fcr\u00fcne g\u00f6re hiyerar\u015fiye uygun ili\u015fkisel olarak tablolarla e\u015fle\u015fecek \u015fekilde kay\u0131t i\u015flemi ger\u00e7ekle\u015ftirilece\u011fi i\u00e7in de primary key a\u00e7\u0131s\u0131ndan bir tutars\u0131zl\u0131k meydana gelmeyecekti. Mevzu bahis <em style=\"color:red;\">TPC<\/em> stratejisi ise verilerin insert s\u00fcreci daha karma\u015f\u0131k hale gelecektir. \u00c7\u00fcnk\u00fc art\u0131k <em style=\"color:red;\">TPT<\/em>&#8216;den farkl\u0131 olarak primary key&#8217;in ili\u015fkisel olarak beslenebilece\u011fi ortak bir tablo bulunmamakta yahut <em style=\"color:red;\">TPH<\/em> gibi eklenecek veriler tek bir sat\u0131rda temsil edilmemektedir. O y\u00fczden abstract class olarak tan\u0131mlanm\u0131\u015f olan base entity&#8217;lerde ki primary key(Id) kolonlar\u0131na kar\u015f\u0131l\u0131k a\u015fa\u011f\u0131daki gibi sequence yap\u0131land\u0131rmas\u0131 olu\u015fturulmal\u0131d\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass ApplicationDbContext : DbContext\r\n{\r\n    .\r\n    .\r\n    .\r\n    protected override void OnModelCreating(ModelBuilder modelBuilder)\r\n    {\r\n        modelBuilder.HasSequence(&quot;ApplicationUserIds&quot;);\r\n        modelBuilder.HasSequence(&quot;StudentIds&quot;);\r\n\r\n        modelBuilder.Entity&lt;ApplicationUser&gt;()\r\n            .UseTpcMappingStrategy()\r\n            .Property(p =&gt; p.Id)\r\n            .HasDefaultValueSql(&quot;NEXT VALUE FOR &#x5B;ApplicationUserIds]&quot;);\r\n\r\n        modelBuilder.Entity&lt;Student&gt;()\r\n            .UseTpcMappingStrategy()\r\n            .Property(p =&gt; p.Id)\r\n            .HasDefaultValueSql(&quot;NEXT VALUE FOR &#x5B;StudentIds]&quot;);\r\n    }\r\n    .\r\n    .\r\n    .\r\n}\r\n<\/pre>\n<\/div>\n<p>B\u00f6ylece tekrardan <em style=\"color:red;\">TPC<\/em>&#8216;nin s\u00f6z konusu oldu\u011fu durumlarda insert i\u015flemine kalkarsak e\u011fer veriler a\u015fa\u011f\u0131daki gibi veritaban\u0131na kaydedilecektir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-6.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"322\" height=\"128\" class=\"aligncenter size-full wp-image-25664\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-6.png 322w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-6-300x119.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-6-320x128.png 320w\" sizes=\"auto, (max-width: 322px) 100vw, 322px\" \/><\/a>Ayriyeten burada dikkat ederseniz e\u011fer her iki tabloda da bir b\u00fct\u00fcnl\u00fck varm\u0131\u015f gibi ard\u0131\u015f\u0131k bir s\u0131ralamada primary key de\u011ferleri art\u0131\u015f g\u00f6stermektedir. Bunu EF Core \u00fczerinden bu verilerin \u00fczerine yeni verilerle insert ger\u00e7ekle\u015ftirdi\u011fimizde daha net anlayabilece\u011fiz;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-7.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"327\" height=\"197\" class=\"aligncenter size-full wp-image-25665\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-7.png 327w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-7-300x181.png 300w\" sizes=\"auto, (max-width: 327px) 100vw, 327px\" \/><\/a><\/p>\n<h4>Hangi Durumlarda Hangi Stratejileri Kullanmal\u0131y\u0131z?<\/h4>\n<p>Entity&#8217;ler aras\u0131 kal\u0131t\u0131msal durumlarda <em style=\"color:red;\">TPH<\/em> stratejisi varsay\u0131land\u0131r. Hiyerar\u015fi ne kadar geni\u015fse b\u00fcy\u00fckl\u00fck a\u00e7\u0131s\u0131ndan do\u011fru orant\u0131da bir tablo in\u015fa edilir ve genellikle tablonun bir\u00e7ok s\u00fctunu bo\u015f kalmaktad\u0131r. Ama bu durum sorgu performanslar\u0131 a\u00e7\u0131s\u0131ndan bir sorun te\u015fkil etmeyecek, her daim sorgulama tek bir tablo \u00fczerinden ger\u00e7ekle\u015ftirilece\u011fi i\u00e7in gayet verimli bir s\u00fcre\u00e7 ge\u00e7irilecektir.<\/p>\n<p><em style=\"color:red;\">TPT<\/em> ise nadiren iyi bir se\u00e7im olacakt\u0131r. Nihayetinde normalizasyona daha uygun bir tasar\u0131m sunmakt\u0131r. Ama bir entity&#8217;e kar\u015f\u0131l\u0131k t\u00fcm verileri birden fazla tabloya b\u00f6lmesi veri sorgulama s\u00fcrecinde ekstradan join maliyetlerine sebep olacakt\u0131r.<\/p>\n<p><em style=\"color:red;\">TPC<\/em> stratejisi ise belirli concrete type&#8217;dan olan entity&#8217;ler i\u00e7in bilgilerin her daim tek bir tabloda tutulmas\u0131n\u0131 sa\u011flanmaktad\u0131r. Bu a\u00e7\u0131dan <em style=\"color:red;\">TPT<\/em>&#8216;nin geli\u015fmi\u015f versiyonu olarak d\u00fc\u015f\u00fcn\u00fclebilir. Abstract t\u00fcrlerin kullan\u0131ld\u0131\u011f\u0131 hiyerar\u015fik tasar\u0131mlarda tercih edilebilir. <em style=\"color:red;\">TPH<\/em>&#8216;ye nazaran da hi\u00e7bir tabloda bo\u015f s\u00fctun bar\u0131nd\u0131rmayaca\u011f\u0131 ve Discriminator kolonu olmayaca\u011f\u0131 i\u00e7in boyut olarak daha az yer kaplayacakt\u0131r.<\/p>\n<p>E\u011fer ki, yap\u0131lan \u00e7al\u0131\u015fmada base t\u00fcrler \u00fczerinden \u00e7al\u0131\u015fmalar sergilenecekse ve base t\u00fcr\u00fcn alt\u0131ndaki s\u0131n\u0131flar \u00fczerinde sorgulama i\u015flemleri ger\u00e7ekle\u015ftirilecekse <em style=\"color:red;\">TPH<\/em>&#8216;\u0131 d\u00fc\u015f\u00fcnebilirsiniz. <\/p>\n<h4>EF Core 7&#8217;yi Sa\u011fl\u0131kl\u0131 Kullanabilmek \u0130\u00e7in<\/h4>\n<p>Son olarak EF Core 7 ile bu makaledeki i\u00e7eri\u011fe e\u015flik edebilmek i\u00e7in projenizde bulunmas\u0131 gereken salt k\u00fct\u00fcphaneleri bildirip i\u00e7eri\u011fimizi noktayal\u0131m.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-8.png\" alt=\"Entity Framework Core 7 - Table Per Concrete Type (TPC) Davran\u0131\u015f\u0131\" width=\"380\" height=\"62\" class=\"aligncenter size-full wp-image-25667\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-8.png 380w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/10\/Entity-Framework-Core-7-Table-Per-Concrete-Type-TPC-Davranisi-8-300x49.png 300w\" sizes=\"auto, (max-width: 380px) 100vw, 380px\" \/><\/a><br \/>\n\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, Bu i\u00e7eri\u011fimizde EF Core 7 ile gelecek olan Table Per Concrete Type(TPC) davran\u0131\u015f modellemesini inceliyor olaca\u011f\u0131z. Table Per Concrete Type (TPC) Nedir? Table Per Concrete Type modellemesinin ne oldu\u011funu ortaya koyabilmek i\u00e7in \u00f6ncelikle&#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":[2851,4677,2850,4676,4681,4682,4678,4679,4680],"class_list":["post-25647","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-entity-framework-core","tag-ef-core","tag-ef-core-7","tag-entity-framework-core","tag-entity-framework-core-7","tag-table-per-concrete-type","tag-tpc","tag-usetpcmappingstrategy","tag-usetphmappingstrategy","tag-usetptmappingstrategy"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25647","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=25647"}],"version-history":[{"count":13,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25647\/revisions"}],"predecessor-version":[{"id":25670,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25647\/revisions\/25670"}],"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=25647"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=25647"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=25647"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}