Entity Framework MySql Eager Loading

Kodla Büyü

togius

Süper Üye
Süper Üye
Mesajlar
1,730
Mebin baskı rejimlerinden kalma hevesle şablonunu dayattığı şu günlerde MySql - Asp.Net birlikteliğini hızlandırmak için kullanabileceğiniz bir yapı. Entity Framework. Onunda kod sorgulamalarında ve filtrelemelerinde elimizi hızlandıracak bir yöntemi eager loading.
 

Ekli dosyalar

  • Entity Framework MySql Eager Loading.rar
    122.4 KB · Görüntüleme: 31
Entity Framework MySql Eager Loading
EntityFramework uygulamalarında lazy loading i MySql ile kullanamıyoruz ne yazık ki bunun sebebi de MySql in Multiple Active Result Sets(MARS) tükçesi iç içe datareader sorgulamalarını desteklememesi. Mars’ta bildiğiniz gibi ms sql 2005 sonrasında gelen bir özellik bu yoldan giderek Mysql kullanacağımızdan bizde eager loading yönteminden faydalanacağız. İlk olarak 2 adet mysql de tablomuzu oluşturalım.

Kod:
CREATE TABLE `tyorumlar` (
  `YorumID` int(11) NOT NULL AUTO_INCREMENT,
  `Yorum` varchar(255) COLLATE utf8_turkish_ci DEFAULT NULL,
  `EkleyenID` int(11) DEFAULT NULL,
  PRIMARY KEY (`YorumID`),
  KEY `fk_uye_yorum` (`EkleyenID`),
  CONSTRAINT `fk_uye_yorum` FOREIGN KEY (`EkleyenID`) REFERENCES `tuyeler` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci

CREATE TABLE `tuyeler` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `adsoyad` varchar(450) COLLATE utf8_turkish_ci DEFAULT NULL,
  `uye` varchar(50) COLLATE utf8_turkish_ci NOT NULL,
  `sifre` varchar(50) COLLATE utf8_turkish_ci DEFAULT NULL,
  `eposta` varchar(50) COLLATE utf8_turkish_ci DEFAULT NULL,
  `seviye` int(11) DEFAULT NULL,
  `iuser` tinyint(4) DEFAULT '0',
  `auser` tinyint(4) DEFAULT '0',
  `suser` tinyint(4) DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci

Yukarıdan da anlaşılacağı üzere tyorumlar.EkleyenID alanı ile tuyeler.id alanlarının bire-çok ilişkisi kuruyoruz.
Daha sonra solution Explorer penceresinden Add New Item -> ADO.Net Entity Data Model seçtikten sonra Add komutuna basıyoruz. Karşımıza gelen pencerede Generate from database seçip next diyoruz. New Connection komutuna basınca karşımıza gelen connection properties penceresinden Server Name, username, password alanlarını doldurduktan sonra database name kısımından kullanacağımız database name i seçiyoruz.





Pluralize or singularize generated object names ve Include foreign key columns in the model checkboxlarını işaretledikten sonra Finish diyelim. Pluralize or singularize generated object names bize tablo adlarının sonuna “s” ekleyerek otomatik generic listler oluşturur.
Örneğin: List<tabloAdi> ile tabloAdis aynı anlama gelir. Tabi uygulamamızda tablolarımız bulunmaya devam edicek.

Şimdi gelelim kod kısmımızda default.aspx sayfamıza 1 adet Literal kontrolü bırakıyoruz. 1 adette radiobuttonlist.
Kod:
<asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True" 
            onselectedindexchanged="RadioButtonList1_SelectedIndexChanged" 
            RepeatDirection="Horizontal">
            <asp:ListItem>Üyeler Tablosuna Göre</asp:ListItem>
            <asp:ListItem>Yorumlar Tablosuna Göre</asp:ListItem>
        </asp:RadioButtonList>
        <br />
    
        <asp:Literal ID="Literal1" runat="server"></asp:Literal>

RadioButtonList1 in SelectedIndexChanged olayı olacak code behind kısmındada onun kodlarını tanımlayacağız.
Gelelim code-behind kısmına.
Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using balikesirModel;
using System.Text;



public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
    }

    private void UyeToYorumlar()
    {
        using (var db = new balikesirEntities())
        {
            var uyeler = from uye in db.tuyelers.Include("tyorumlars")
                         select uye;
            StringBuilder sb = new StringBuilder();

            foreach (var uye in uyeler)
            {
                sb.AppendFormat("<p><b>{0}</b>", uye.adsoyad);
                foreach (var yorum in uye.tyorumlars)
                {
                    sb.AppendFormat("<br />|-->{0}", yorum.Yorum);
                }
                sb.Append("</p>");

            }
            Literal1.Text = sb.ToString();
        }
    }
    private void YorumFromUyeler()
    {
        using (var db = new balikesirEntities())
        {
            var yorumlar = from yorum in db.tyorumlars.Include("tuyeler")
                           select yorum;
            StringBuilder sb = new StringBuilder();

            foreach (var yorum in yorumlar)
            {
                sb.AppendFormat("<p><b>{0}</b>", yorum.Yorum);
                sb.AppendFormat("<br />Gönderen:{0}", yorum.tuyeler.adsoyad);
                sb.Append("</p>");
            }
            Literal1.Text = sb.ToString();
        }
    }
    protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if(RadioButtonList1.SelectedIndex==0)
            this.UyeToYorumlar();
        else
            this.YorumFromUyeler();
    }
}
Farketmişsinizdir. Include diye bir ifade kullandık. Peki neden biri .Include(“tyorumlars”) ama diğeri .Include(“tuyeler”). Include ifadesi EntityFramework yapılarında eager loading (Verilere ihtiyaç duyulsun duyulmasın tanımlandıkları anda transfer edilmesi için kullanılır.) ilişkili tabloyu olaya dahil etmek için kullanılır ve birden çok include yapabiliriz Ama buda performası olumsuz etkileyecektir. Bunu önlemek için saklı yordamlardan (stored procedurelerden) yararlanabiliriz. Peki bizim yapımızda neden Peki neden biri .Include(“tyorumlars”) ama diğeri .Include(“tuyeler”). Sebebi şu üyeler tablolusu referans tablosu olduğundan yani bir üye birden çok yoruma sahip olabileceğinden direk olarak tablo ismini dahil ediyoruz. Ama bir üye birden çok yorum yazabileceği için pek çok o üyeye ait tyorumlar sınıfı dolayısıyla tyorumlars olacaktır. İngilizcede ki tekil – çoğul mantığına benzer akılda kalması açısından ama aynı değil.
 
Geri
Üst