26 Mayıs 2012 Cumartesi

HTML ve XHTML - Intro

Merhaba arkadaşlar.
Bu yazım bir nevi "XML Intro" makalemin devamı niteliğindedir.Bildiğiniz üzere "markup language" (işaretleme dilleri) ne "XML Intro" makalemde giriş yapmıştım. Bu makalemde de diğer bir işaretleme dili olan HTML işaretleme dilini inceleyeceğiz. Html ve xml işaretleme dillerinin, yine bu dillere çok benzer xHtml diliyle olan benzerliklerini ve farklılıklarını inceleyeceğiz.

  • HTML (Hyper Text Markup Language)

Açılımının anlamı "yüksek metin işaretleme dili" dir. Programlama dili değildir, çünkü sadece Html dilinin çalışabilen bir yapısı yoktur. Diğer programlar tarafından yorumlanabilir. Yine Xml in tasarımcısı Tim Berners Lee tarafından Isviçre 'nin Cern kentinde tasarlanmıştır. Internet üzerinden text, resim, müzik, video gibi değişik tipteki verilerin nasıl taşınması gerektiğini belirtmek için kullanılan bir işaretleme dilidir. Browser lar bu html dosyalarını yorumlayarak son kullanıcıya web sayfasını gösterirler. Tüm browser ların bir html sayfasını okuyabilmesi için belirli bir standatı verdır. Html de bize bu standartı sağlar. Fakat yine de her browser ın bir HTML sayfasını yorumlama şekli kasıtlı olarak farklı olabilir.

Html sayfası sunulur ve daha sonra bu sayfayı okumak isteyenler okur. Yani bir publisher (yayıncı) birden fazla da subscriber (abone) vardır. Html in çıkış amacıda zaten Tim Berners Lee 'nin makalelerini yayınlamak ve paylaşmak istemesiydi. Önceleri intranetti daha sonra 1989-90 yıllarında tüm www tarafından erişilebilidi. Yayını yapan kişi yazının bazı yerlerini bold, italik vs.. yapmak isteyebilir. Yada başlık kullanmak isteyebilir. 

Bir html çıktısı birden fazla sayfanın bağlanmasıyla da üretilebilir. Ve bileşenlerinde "ccs, javascript, jquery" gibi öğerler de barındırabilir. "Client Side" tarafından "Server Side" tarafına yapılan "get request" (istek), sunucuda sayfanın oluşmasını sağlar. Oluşan sayfa bileşenleriyle birlikte bir "Html" sayfasına "render" edilir ve gelen isteğe karşı "response" (tepki yada yanıt) verilmiş olur. Ayrıca "page life cyle" makalemde bu süreci anlatacağım.

Html dosyaların aktarımı için HTTP (Hyper Text Transfer Protocol) protokolü kullanılır. Html sayfalar sunucuda .html yada .htm uzantılı olarak kaydedilir. Fakat eğer browser da görüntülenen kaynak, aynı makinedeki bir dosya sisteminden okuyorsam ftp protocol u görünecektir. Asp.net development tools yayınlar, biz de erişebiliriz. Localhost sunucuyu ve port u gösterir. Normalde 80 nolu internet portundan yayınlanır ama kendi makinemizde çalışıyorsak, hem sunucu hem de istemci olduğumuzdan dolayı (localhost), farklı gösterecektir.

Xml de bir kök element olurdu ve bu kök elementin altında birçok element olurdu. Html de ise kök element html tag idir. Aşağıdaki gibi bir html dosyası ekliyorum.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
       <head>
             <title></title>
       </head>
       <body>
      
       </body>
</html>
Html kök elementinin altında iki tane alt element bulunur. "Head" ve "Body" elementleri olmak üzere. Head elementinde, sayfanın browserdaki başlağı (<title>Gaffar Salkım</titleyazarsak browser daki başlık"Gaffar Salkım" olacaktır.), site bilgileri, meta (temel) bilgiler, sayfanın kullandığı diğer document ler (css, javascript, jquery gibi..), arama mototuna verilen diğer komutlar, indexler, görünmeyen ama sayfa ile ilgili direktifler verilir. Body de ise yayınlamak istediğimiz verileri bulunur.
<head>
    <title>Yazılımda Son Nokta</title>
    <meta name="author" content="Gaffar Salkım />
    <meta name="description" content="Bu site bir başka site" />
    <meta name="keywords" content="c#, programlama, web, html, xHtml, css, javascript" />
</head>
 Yukarıdaki meta bilgileri tamamiyle arama motorlarına yardımcı olmak için kullandığımız bilgilerdir. Bu bilgiler sayesinde anahtar kelimelerimizi, site yazarını, sitede kullanılan teknolojileri gibi, tüm meta bilgileri sitenizin "Head" tegleri içerisinde kullanabilirsiniz.

Her yazı tipinin, şeklinin, boyutunun, altsatırın, boşluğun vs.. gibi ifadelerin Html de bir karşılığı vardır. Şimdi gelin bu standartlar bir gözatalım.
Altsatıra geçmek için satır sonunda "br" (breaking return) tag i kullanılır:
 <body>
     Gaffar Salkım<br />    
 </body
kullanılırHtml document içerisinde başı boş bir metnin olması önerilmez. Bu metin "span" teglerine alınabilir.Bu teg c sharp kontrollerindeki Label dır.Label lar Html e render edildiğinde span olarak dönüştürülürler. Yada metnimi "p" (paragraf) teglerine de alabilirim.
<span>Gaffar Salkım</span>
 <p>Gaffar Salkım</p>

6 çeşit başlık boyutu vardır. "h1" en büyük, "h6" (h-header) en küçüktür. Ne kadar bir kısıtlama olarak görünse de web browser ları için "SEO" (Search Engine Optimization - Arama Motoru Optimizasyonu) için gerekli bir standart oluşturmada faydalıdır.
    <h1>
        gaffar salkım</h1>
    <h2>
        gaffar salkım</h2>
    <h3>
        gaffar salkım</h3>
    <h4>
        gaffar salkım</h4>
    <h5>
        gaffar salkım</h5>
    <h6>
        gaffar salkım</h6>
 Çıktısı ise;
şeklindedir.

 Html document i içerisinde yazdığınız yazılarda kelimeler arası bir boşluk koymak istediğinizde hiç bir html ifadesi kullanmanıza gerek yoktur. 
<body>
    Gaffar Salkım
</body>
Fakat birden fazla boşluk koymak istiyorsanız, boşluk başına "&nbsp;" (non-breaking space) keyword unu kullanmalısınız. Örneğin iki boşluk koymak istiyorum. Ya böyle yapabiliriz:
<body>
    Gaffar&nbsp;&nbsp;Salkım
</body>
 yada
<body>
    Gaffar&nbsp; Salkım
</body>
şeklinde bir "space" hakkımızı da kullanarak yazabiliriz. 

Metnimizin italik olması için i (italic) tegleri arasında, kalın olması için b (bold) tegleri arasında, altı çizili olması için u (underline) tegleri arasında yazmalıyız. 
       <i>gaffar salkım</i> 
       <u>gaffar salkım</u> 
       <b>gaffar salkım</b>
gaffar salkım gaffar salkım gaffar salkım

Metnimizin hem italik, hem de bold olması için:
       <i><b>gaffar salkım</b></i>
yada
       <b><i>gaffar salkım</i></b>
şeklinde yazmalıyız.
gaffar salkım

"strong" tegi "bold" tegine çok benzerdir, yazı tipine göre benzerlik azalı yada artar. Makalede vurgulanmak istenilen metinler bu teg arasında yazılmalıdır. "small" küçük, "big" tagi ise metni büyük bir font size ile yazar.
       <strong>gaffar salkım</strong>  
       <small>gaffar salkım</small> 
       <big>gaffar salkım</big><br />
gaffar salkım gaffar salkım gaffar salkım

"cite" tegi makalelerde alıntıyı belirtmek için kullanılır. İtalik bir fonta sahiptir. Yazı rengi ve fontu da farklıdır. 
       <cite>Bu bir alıntıdır.. </cite>
Bu bir alıntıdır.. 

Bir paragraf şeklinde bir alıntı yapılacaksa "blockquote" (blok alıntı) tegi kullanılır. Girintili bir şekilde belirtilir.
<blockquote>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras luctus quam 
    imperdiet sit amet pretium elit lobortis. Integer nulla augue, elementum 
    in, dapibus et ligula. Nunc augue enim, cursus id facilisis at, lobortis 
    Aliquam convallis sollicitudin pretium. Pellentesque a tincidunt est.
    turpis.
</blockquote>
Source tarafta "pre" teglerine yazılan girintili bir metin, design tarafında da aynı o şekil girintili bir şekilde görünür.
    <pre>
         Lorem
            ipsum dolor sit amet,
                     consectetur adipiscing elit.
     Cras luctus quam at libero
    </pre>
 Design da <br/> yazmak istersem, "&lt;(less than)=<" ile "&gt;(greater than)=>" işaretlerini kısaltılmış bir şekilde yazmalıyım:
&lt;br/&gt;
Metni sağdan sola yazmak istersek "bdo" tegleri arasında "dir" (direction) attribute değerine "rtl" (right to left) vererek yazabiliriz. Yine "ltr" (left to right) diyerek duz yazabiliriz.
<bdo dir="rtl">gaffar salkım</bdo>
mıklas raffag

Bir kod örneği paylaşmak istiyorsak "code" ve "pre" tegleri içerisine yazdığımız kodlar aynı şekilde görünecektir.
<code>
  <pre>
    public class Category
    {
        public int Id { get; set; }
        public string CategoryName { get; set; }
        private List&lt;Book&gt; _book;
        public List&lt;Book&gt; Books
        {
            get
            {
                return _book = _book ?? new List&lt;Book&gt;();
            }
            set
            {
                _book = value;
            }
        }
    }
  </pre>
</code>

"Abbr" tegi, içerdiği kelimenin, bir kelime veya kelimelerin kısaltılmış hali olduğunu belirtir. Bununla birlikte baş harflerinden oluşan kısaltma tanımlanmasını sağlayan "acronym" tegine HTML 5 te hiç yer verilmediği için kısaltmalarda "abbr"  kullanılması tavsiye olunmuştur.
<abbr title="Eğitmen">gaffar salkım</abbr>
<acronym>gaffar salkım</acronym>

"center" tegleri arasındaki öğeler tahmin edildiği üzere sayfanın ortasında yer alırlar.
<center>
    Gaffar Salkım
</center>

"tt" tegi tele type fontu ile yazıldığını belirtir. Bu teg ve aşağıdaki tegler genelde program kodları göstermek için kullanılır.
<code>Bilgisayar kod yazısı
<kbd>Klavye yazısı
<samp>Örnek bilgisayar kod yazısı
<tt>Defines teletype text
<var>Bir değişken/kararsız yazı
<pre>Biçimlendirilmiş yazı
<tt>Teletype text</tt>
 Teletype text

"sub" tegi, altyazı, "suo" tegi ise üst yazı belirtir.
H<sub>2</sub>O X<sup>2</sup>+Y<sup>2</sup>=1
H2O X2+Y2=1
"dl" tegi terim listesi oluşturmamızı sağlar. "dl" tegleri içerisinde "dt" teginde terim, "dd" teginde ise açıklaması yazılır. Böylece açıklamalar girintili bir yapı şeklinde görünür.
<dl>
      <dt>Terim1</dt>
      <dd>Terim1 açıklama</dd>
      <dt>Terim2</dt>
      <dd>Terim2 açıklama</dd>
</dl>
Terim1
Terim1 açıklama
Terim2
Terim2 açıklama

  • XHTML (Extensible HTML )

XHTML, Html 4.0 dilinin Xml 1.0 dilindeki extensible (genişletilebilirlik) ilkesine göre yeniden düzenlenmiş halidir. 20 Ocak 2000 de W3C tarafından bir web standartı olarak kabul edilmiştir. Html in hemen hemen aynısı olmasına rağmen kodlamada farklılıklar vardır. Genişletilebilir olduğundan dolayı yeni elementler eklenebilir. 

Html e göre daha kesin kurallar konulmuştur. Html de bir tag i açtıktan sonra kapatmasak da olurdu ve attribute lerde değer verirken tırnak kullanmasak da, tek tırnak kullansak da olurdu. Fakat xHtml de bir tag açılmışsa mutlaka kapanmalıdır. Vaya atrribute değeri mutlaka çift tırmakla verilmelidir. İlk açılan element son kapanmalıdır. Bu da şu anlama gelmektedir ki standartlaşma daha iyi olduğundan dolayı, hızlı okuma gibi avatajlar sağlanmıştır. XHtml deki elementlerin özellikleri ve nerelerde kullanılabileceği DDT dosyasında belirlenmiştir. Ayrıca Html den farklı olarak, bu kesin standartlaşma sayesinde, XHtml deki bilgiler başka amaçlarla da kullanılabilir. Örneğin bir XHtml dökümanı Xslt sayesinde pdf formatına dönüştürülebilir.

XHtml, herhangi bir xml i okuyan editör ile editlenebilir. Namespace kullanarak, bir xml dökümanın içerisinde  
başka bir xml dökümanından element kullanılabilir. XHtml de bu geçerlidir.

Bir XHtml dökümanını oluştururken yine Html deki gibi bir Html root elementi olmalıdır. Ayrıca xmlns (xml namespace) attribute u ileXHtml namespace i belirtilmelidir. 

<html xmlns="http://www.w3.org/1999/xhtml">

XHtml de de büyük-küçük harf duyarlılığı vardır. Ama element isimleri ve attribute ler küçük harf olmalıdır. 

Başka bir yazıda görüşmek dileğiyle, hoşçaklın..

25 Mayıs 2012 Cuma

XML - Intro

Merhaba arkadaşlar.
Bu yazımda, web programlama dünyasında sıkça adını duyduğumuz XML, HTML, XHTML kavramlarını ve bu kavramların birbirinden farklarını inceleyeceğiz. Ama hepsinin bir ortak özelliği vardır ki o da "markup language" yani işaretleme dili olmasıdır. Bazı kesimler tarafından programlama dilleri olarak algılansa da programlama dilleri değil işaretleme dilleridir. Yani sadece bu diller kullanılarak bir program geliştirilemez. Bu dillerde veriler kendilerine özgü işaretlerle yani taglerle işaretlenir. Amaç veride bir okuma-yazma standartı oluşturmaktır. Şimdi daha ayrıntılı bir şekilde inceleyelim.
Bu dillerin bir diğer ortak özellikleri ise "Client Side" tarafında çalışılıyor olmasıdır. Yani örneğin bir asp.net sayfası "Server Side" tarafından, istemciye gönderilmek üzere, Html diline "render" edildiğinde, istemciye Html çıktısı içerisinde sayfanın "html, css, javascript, jquery" gibi öğeleri de gelecektir. Yani bu öğeler client side tarafında bir internet tarayıcısı sayesinde yorumlanıp, son kullanıcının anlayacağı şekilde gösterilecektir. Ayrıca bir sayfa görüntülenmek istendiğinde ne gibi işlemlerin gerçekleştiğini başka bir yazımda açıklayacağım.

  • XML (Extensible Markup Language)

Açılımının anlamı "genişletilebilir işaretleme dili" dir. 90 'lı yılların sonlarına doğru W3C consortium tarafından tanımlanmış ve kısa sürede yaygınlaşmış bir işaretleme dilidir. Ama tasarımcısı HTML 'in de tasarımcısı olan Tim Berners Lee adındaki bir fizikçidir. Amaç, verilerin standart bir şekilde saklanmasını, okunmasını ve taşınmasıdır. Akıllı veri sorgulaması yapmaya olanak sağlar. Bu nedenle performanslıdır. Ayrıca HTML in aksine, önceden tanımlı tag ler yoktur, genişletilebilir olmasının verdiği avantaj sayesinde ihtayaca göre tag ler yazılarak uygulamaya esneklik sağlar. Tamamen kullanıcıya bırakılmıştır.

Günümüzde bir çok platformda uygulama geliştirilmektedir. Bir xml dökümanında veriler belirli bir kurala göre saklandığından dolayı bir çok platform arasında veri taşıma işlemini de çok kolay bir şekilde gerçekleştirir. Yani xml,  IT dünyasının ingilizcesi gibidir. Nasıl ingilizce dili bir dünya dili olmuşsa, xml de bir çok platform tarafından tanınır ve desteklenir. 

Sadece platformlar arası değil, programlamada da geliştiriciler tarafından sıkça kullanılır. Örneğin configuration dosyalarında veriler xml şeklinde tutulur. Ayrıca Ado.Net (ActiveX Data Objects) namespace inindeki X harfi, bu teknolojinin XML e tam uyum sağladığını göstermektedir. Bu namespace nin disconnected mimaride, bize sağladığı DataSet gibi sınıflar sayesinde, Provider dan bağımsız olarak, verileri XML şeklinde saklanmaktadır. Böylece verileri istediğimiz şekilde taşıyabiliriz. Ayrıca bir diğer örnek ofis uygulamalarıdır. Microsoft Ofis 2007 programları sayesinde veriler XML şeklinde tutulmaktadır. Uzantılarının sonuna da x eki gelmektedir; docx, xlsx vs.. Yine bir başka örnek Merkez Bankası döviz kurlarını XML şeklinde yayınlar. (http://www.tcmb.gov.tr/kurlar/today.xml bu adresten bakabilirsiniz. Sayfada sağtık "kaynağı görüntüle" seçeneğiyle xml dosyasını inceleyebilirsiniz.) Böylece bir çok platform ve kuruluş, yayınlanan bilgiler, formatlı oldukları için rahat bir okuma yapabilir. Xml dosyalar web browser lar ve notepad gibi programlar tarafından da görüntülenebilir.

XML in bir diğer özelliği ise IT dünyasının sevimli çocuğu olmasıdır. Hiçbir firewall xml dosyalarını engellemez. Çünkü içerisinde sadece veri bulunduğunu bilir. Bu nedenle dış dünyaya açılabilmesi için ayrıca bir port istemez, 80 nolu internet portu sayesinde haberleşme sağlanır.

XML dosya uzantısı ".xml" dir. XML dosyasındaki texte, "xml document" (döküman) denir. XML dökümanı "element" lerden meydana gelir. En dıştaki elemente "root element" (kök element) denir ve bir xml dökümanında bir tane "root element" bulunabilir. Root element altında bir çok element tanımlanabilir. Bu root element altında tanımlanan elementler de "child element" denir. Ama nihayetinde xml dökümanındaki herbir elemente "node" denir, (özellikle child elementin altındaki elementlerine). Bu nedenle root-child elementlerine, root node-child node da denir. Her elementin bir açılış (<ad>) bir de kapanış (</ad>) "tag" i vardır. Bir xml elementi içerisinde ya doğrudan veri bulunur yada başka elementler bulunur. Element aynı tag de açılıp kapanmışsa (<ad/>) içerisinde veri veya başka bir elementin bulunmadığı anlaşılır. 

Bir ağaç yapısına sahiptir, ağcın kökü ve bir çok dalı vardır. Xml dosyasında da bir kök elementi bulunur ve o kök element bir çok elementi içerebilir. Aynı zamanda bu dallanma bir hiyerarşinin de göstergesidir. Girintili bir yazım ile yazılır. Ayrıca XML dosyası büyük-küçük harflere karşı duyarlıdır. Yani "case sensitive" bir dildir. Ayrıca boşluklar da önemlidir.

Şimdi Visual Studio da bir XML dosyası ekleyelim ve bu dosya üzerinde inceleyelim. Bir XML file ekledikten sonra aşağıdaki gibi bir xml tag i varsayılan olarak gelir.

<?xml version="1.0" encoding="utf-8" ?>

Soru işareti ile başlayan bu tag xml dosyasının "declaration" (tanımlama) elementdir (giriş elementi olarak da geçer). Bu işaret o elementin, veri taşımadığını belirtir, bu elementin içinde o xml dosyasının "version" ve "encoding" gibi özelliklerini vermemizi sağlar.Encoding özelliğine "utf-8" vererek bu xml dosyasında unicode character ler kullanılabileceğini belirtiyoruz. Yorum satırını aşağıdaki gibi oluşturabiliriz.
    <!--Yorum Satırı-->
Örneğin bir "dunya" kök dizini ekleyelim ve altında hiyerarjik bir şekilde tag lerle "kıta", "ulke", "il" elementleri belirtelim:
<dunya>
  <kita ad="avrupa">
    <ulke ad="türkiye">
      <il>istanbul</il>
      <il>ankara</il>
      <il>izmir</il>
    </ulke>
    <ulke ad="almanya">
      <il>berlin</il>
      <il>frankurt</il>
      <il>bonn</il>
    </ulke>
    <ulke ad="san marino"/>
      <!--Şehri yok, bir şehir ülkesidir. Bu yüzden böyle tanımlayabiliriz.-->
  </kita>
  <kita ad="asya">
    <ulke ad="çin">
      <il>shangy</il>
    </ulke>
    <ulke ad="japonya">
      <il><![CDATA[nagazagi]]></il>
    </ulke>
  </kita>
</dunya>

Bazen elementlerin inner textlerinde özel karakter(@, <, >, ., ;, ! gibi..) kullanmak isteyebiliriz. Kullanmak için  metnimizi yukarıdaki gibi <![CDATA[nagazagi]]> tagleri içerisine yazmalıyız. Böylece metinlerimiz, veri olarak algılanmasını sağlanır. Genelde url ler xml in yapısını bozabileceğinden dolayı, bu tagler içerisinde yazılır.

Tag in içerisinde kırmızı renkte yazılan ifadelere "attribute" (öz nitelik) denir. Hangi element içerisinde yazılmışsa o elementi niteler. Anahtar - değer ilişkisi vardır. Yani öz niteliğin adı ve değeri vardır. Bir elemente bir çok attribute verilebilir. W3C, attribute ların node lardan daha hızlı okunduğunu söylemektedir. Ayrıca attribute u amacında kullandığımızda xml text dosyasının boyutunu da ekonomik kullanmaktadır. Bu nedenle eğer bir elementi niteleyecek bir özellik belirtilecekse, attribute şeklinde yazılmalıdır. Yani,

    <ulke>
      <ad>turkiye</ad>
      <il>istanbul</il>
      <il>ankara</il>
      <il>izmir</il>
    </ulke>

bu şekilde yazmak yerine:

    <ulke ad="türkiye">
      <il>istanbul</il>
      <il>ankara</il>
      <il>izmir</il>
    </ulke>
Yazmak yukarıda belirtilen sebeplerden dolayı daha avantajlıdır.

Xml dökümanın yapısıyla ilgili ayrıntılar DTD (Document Type Defination) yada XSD (Xml Schema) adı verilen harici dökümanlarla da verilebilir. Uzantıları da aynı bu şekildedir (.dtd ve .xsd). XSD nin öncesi de DTD dir. Xml documanın nasıl yorumlanacağını belirtir. XSL (Style Sheet), dosyaları da xml dökümanın görünüşünü belirtir.

Umarım yardımcı olabilmişimdir. Başka bir yazıda görüşmek dileğiyle, hoşçakalın.. 

19 Mayıs 2012 Cumartesi

Entity Framework - Database First

Merhaba arkadaşlar.
"EntityFramework 4.0 ile gelen ORM araçlarıyla : db yada uygulama model den birini oluştururuz, diğeri ondan oluşur. Varolan bir database i uygulamaya uyarlama işine Database First yaklaşımı, uygulamada var olan nesneleri de database e uyarlama işlemine de Model First yaklaşımı denir."
demiştik ORM giriş yazımızda. Bu yazımda "Database First" yaklaşımını inceleyeceğiz. Database deki her bir tablo bir entity sınıfı, o tablonun her bir kolonu ise bir porperty olacaktır. Entity nin kelime anlamı ise birim yada varlıktır. Primary key ler entity key olacaktır. Bu kolonların tipini ve tablolardaki foreign key olarak tanıladığımız, tablonun diğer tablolar ile arasında olan ilişkiyi nasıl göstereceğimizi göreceğiz. Gelin o zaman Northwind veritabnını map edebilim. Bunun için SqlServer daki diagramımıza bir bakalım.

Projeme Data sekmesi altında, bir ADO.NET Empty Data Model ekliyorum. Adına Nortwind veritabanını modelleyeceğimden dolayı Northwind diyorum.
İki seçenek geldi karşıma. Generate form Database, Empty Model. Ben varolan bir database den türeteceğim, generate edeceğim. Bu nedenle Genarte from Database seçeneğini seçiyorum. Eğer Model First çalışsaydım Empty Model seçeneğini seçecektim. Next dedim.
Aşağıdaki pencerede amaç connection string imizi oluşturmak. Önceden oluşturduysak görüldüğü gibi ismiyle birlikte saklar ve bu seçeneği sunar. Farklı bir connection string ile bağlanacaksam new connection diyerek belirtebilirim. Ben windows authentication ile bağlanacağım. Fakat sql  authentication ile giriş yapacaksam olsaydım sensitive dataları saklama seçenekleri enable oluırdu. Sensitive datalardan kastı user id ve password bilgileridir. Altında app.config dosyasında hangi isimle görüneceğini belirtiyor. Değiştirebiliriz ama kalsın değiştirmiyorum. Bu arada Entity Connection String 'deki EntityClient Provider arka planda SqlClient kullanır. Zaten new connection desem de değiştirilemeyeceğini görebilirsiniz. Bu da ORM 'nin sadece sql server uyumlu olduğunu gösterir. DotNet 4.1 den sonra entity ile oracle a bağlanılabilir. 
Veritabanındaki tablo, view, sp nesnelerim geldi. SqlServer daki tüm nesnelerimin uygulamamda nasıl generate edildiğini görmek açısından tüm nesnelerimi seçiyorum.

Plurize or singularize generated object names seçeneği, sadece ingilizce tablo isimleri için kullanılır. Bu seçeneği tikleyerek, çoğul tablo isimleri entity e dönüştüğünde tekil isimli olacaktır. Bu seçeneği tikliyorum. Her tablo (ara tablo değilse) entitydir. Include forgn key columns in the model seçeneğiyle, tablodaki her bir foregin key için de birer property oluşturacaktır. Bu seçeneği de tikliyorum. Finish diyorum.              

Görüldüğü üzere aşağıdaki gibi Solution Explorer penceresine edmx(Entity Data Model) uzantılı Northwind Data Model 'im geldi. Referanslara da System.Data.Entity, System.Runtime.Serialization, System.Security dll 'lerini kendisi ekledi.
App.config dosyasına da connection stringi belirttiğim isimde yazdı.

  <connectionStrings>
    <add name="NorthwindEntities" connectionString="metadata=res://*/Northwind.csdl|res://*/Northwind.ssdl|res://*/Northwind.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=Northwind;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

Aşağıda edmx dosyasının bir kısmını görüyorsunuz. Görüldüğü üzere her bir tablo entity sınıfı, her bir kolon property olmuş. İşte arkadaşlar Mapping budur. Entity lerin ikonu, class ikonu olan mavi küp şeklinde. Sql server daki tablolara baktığımızda arasında one to many, one to one, many to many ilişkileri mevcuttu. Sql server diagramlarından farklı olarak buradaki ilişkilerde many to many ilişkiler için oluşturulan ara tabloları göremeyiz. Örneğin Customer classının Orders adında bir navigation property si var. Eğer bu iki tabl many to many ilişkili olsaydı, Order tablosunda da Customer değil Customers adında bir navigation property si bulunurdu.
Bir değer bir farklılık ise aşağıdaki gibi one or zero (0,1) to many ilişkisi. one or zero (0,1) to one da olabilirdi. Bu ilişkinin okunmasınsa dikkat edilmesi gereken nokta ya bir müşterinin Order tablosunda birden fazla kaydı bulunabilir. Yada bir müşterini order tablosunda hiç kaydı olmayabilir, şeklinde okunur. Bunun yapılabilmesi için Order tablosundaki CustomerID foreign key kolonu nullable (boş geçilebilir) bir alan olmalıdır. Sql Server a bakalım gerçekten de öyle mi?
Görüldüğü üzere boş geçilebilir bir alan. Modellenirken de bu ilişkiyi 0,1 bir şeklinde belirleniyor.

Bu modellemenin en güzel özelliklerinden biri de yukarıda da göründüğü gibi entitylerin altında bulunan Navigation Properties 'dir. Örneğin Order entity si için bu ilişki şöyle okunur: Her order ın customer i, employee si, details leri, shipper i vardır. Yani bildiğimiz OOP deki Has A kavramı. Bir sınıfta başka bir sınıfın tipinde bir sınıf üyesi bulunabilir. Burada da bir entity de başka bir entity tipinde bir entity üyesi bulunabilir. Order_Details navigation property sinin çoğul olmasının nedeni, bir orderın birden fazla detail inin olabileceğindendir. Entity, navigation property si içinde bulunan entity ile ilişkisine göre, navigation property i tekil yada çoğuldur. Navigation property lerini kullanarak t-sql de inner join ile yapabildiğimiz her şeyi "Order  o = new Order(); o.Customer.CompanyName" diyerek erişebilmemizdir. Örneğin :
Gerçekten büyük kolaylık. Aynı işlemi ado.net ile gerçeklemeye çalışsaydık, inner join li bir sorguyu SqlDataReader nesnesiyle çalıştırmak zorunda kalacaktık. Kısacası navigate prop, bir entity nin aynı model içerisindeki bir başka entity nin özellikleri dir.

Madem bir mapping yani bir modelleme işlemi yapıyoruz, SqlServer daki her bir tipin uygulamada bir karşılığı olmalıdır. Örneğin her bir kolon tipinin nasıl bir karşılıklarının olduğunu görmek için, şimdi de bu property lerin özelliklerine bir bakalım.
 




CustomerName property sinin tipi stringtir. Sql de nchar, nvarchar, char, varchar tipleridir. unicode= true ise nchar yada nvarchar dır, Fixed lengt=true ise nvarchardır. Max length=5 ise nvarchar(5)dir. Bu bilgileri birleştirerek sql server da nvarchar(50) oduğunu, nullable=false ile de boş geçilemez olduğunu anlıyoruz. Bakalım SqlServer da gerçekten de öyle mi?


Bir de OrderID property sine bir bakalım.
Tipi "int32", "StoreGenaratedPattern = identity" yani otomatik artan, "entity key=true" olması sql server da  "primary key" olduğunu gösterir. "Nullable=false" ile de boş geçilemez olduğunu anlıyoruz.

Örneğin "order entity" sindeki "freight property" sinin tipi "decimal" olmuştur. Çünkü sql de "money" olan tiplerin karşılığı "decimaldir". "Precision ve Scale" özellikleri "Decimal(19,4)" olduğunu belirtir.
Görüldüğü üzere her tipin bir karşılığı bulunur.

"Northwind.Designer.cs" dosyası "ORM" mizin nasıl bir "Code Generating" işlemini yaptığını göreceğimiz dosyadır. İncelemek gerekirse:
  • Constructors: Bu region altında "NorthwindEntities" context class ımız hangi yapıcı ile örneklendiğinde, base sınıfı yani "ObjectContext" sınıfı hangi yapıcısıyla örnekleneceği tanımlanmış. DotNet 4.1 de "CodeFirst" yaklaşımını uygularken bu context i, "DbContext" sınıfından türeteceğiz.
  • ObjectSet Properties: Bu region altın "ObjectSet" generic koloksiyonu her enitity tipi için tanımlamış.
  • AddToMethods: ObjectSet Properties 'deki ObjectSet generic koloksiyonlarına ekleme metotları tanımlanmış.
Şimdi de Entities ragion altında ne gibi yapılar meydana geldiğine bir bakalım. 
  • Entities: Bu bölümde ise veritabanındaki her bir tablomun ve view nesnelerinin partial class 'a dönüştürüldüğünü görebiliriz. Yukarıdaki resimde üstteki view, alttaki tablodur. View in de bir tablo gibi generate edilmesinin sebebi geriye tablo gibi bir sonuç döndürmesidir. Partial class olmasının nedeni ise örneğin Shipper classına bir şey eklemek istediğimde, benim yaptığım bu ekleme işlemlerini bu NorthwindEntities classıyla karışmaması açısından fiziksel olarak ayrı, fakat aynı isimde, yine bir partial bir classda tanımlamak isteyebilirim. Bu nedenle partial tanımlanmıştır. Biraz sonra Shipper classı için ToString metotunu override etme ihtiyacı duyacağız. Bunun için aşağıdaki gibi bir "OverrideToStrings" classı oluşturuyorum. İsmini sadece dosya ismi için verdim. Amacım tüm entity lerin "ToString" metotunu bu dosyada ezmek.
    public partial class Shipper    
    {
        public override string ToString()
        {
            return this.CompanyName;
        }
    }

Burada oluşturduğum "Shipper" sınıfının "access modifier" ı, "NorthwindEntities" classındaki "Shipper" class ıyla aynı olmak zorundadır. Aksi halde derleme esnasında bu parital class lar birleştiğinde bir çakışma meydana gelir ve hata ile karşılaşılır. Ama oluşturduğumuz sınıfın "access modifier" ını belirtmezsem hata almam, derleme esnasında diğer partial sınıfın "access modifier" ın alır.

Şimdi Entities region ı altındaki ragion lara da kısaca değinelim.
  • Factory Method: Bu reigon da içinde bulunduğu entity den bir örnek oluşturuluyor.
  • Primitive Properties: Yukarıdaki mapping görüntüsünde entitylerdeki properties sekmesi altındaki propertylere "Primative Properties" denir. "Entities" region altında her entity için "Primitive Properties" region mevcut. Bu region da içinde bulunduğu entity nin propertylerinin (db deki kolonlar) "attiribute" larla özellikleri belirtilmiş. Get ve set metotları oluşturulmuş.
  • Navigation Properties:  Bu ragion da yukarıdaki mapping görüntüsünde entity lerdeki "Navigation properties" leri generate edilmiştir. Primative proplerdan farklı attirbute ler ile nitelenmiştir.
Bir de ObjectContext sınıfındaki bazı metotlara bir bakalım:
Görüldüğü üzere AddObjeect, SaveChanges, DeleteObject, DeleteObject, CreateDatabase, DeleteDatabase verilerimi maüpüle edebileceğim bir çok metotun hazır olarak gelmiş.

Şimdi kodlara geçelim. Aşağıdaki gibi bir arayüz hazırlayalım.
Gerisi bizim bildiğimiz klasik OOP tekniğidir. Insert ve Update işlemlerini aynı "Button" altında tasarlamayı tercih ettim. Siz istediğiniz gibi kullanabilirsiniz. NorthwindEntities nesnesin bize sağladığı metotları ve koleksiyonları kullanarak verilerimizi manipüle edebileceğiz. 

        NorthwindEntities entities = new NorthwindEntities();       //object context
        private void buttonKaydet_Click(object sender, EventArgs e)
        {
            if (selectedShipper == null)
            {
                selectedShipper = new Shipper();
                entities.Shippers.AddObject(selectedShipper);      //remde gerçekleşti.
            }
            selectedShipper.CompanyName = textBoxFirma.Text;
            selectedShipper.Phone = textBoxTel.Text;
            entities.SaveChanges();                     //db e kaydedilir. Db ye modelledi

            Clear();
            listBox1.DataSource = entities.Shippers.ToList();       //databaseden sorgular getirir. ToList siz kullanılırsa contextin remdeki son halini getirir. ToList i eklediğimde db den güncel çeker
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            listBox1.DataSource = entities.Shippers.ToList();            
        }

        public void Clear()
        {
            selectedShipper = null;
            textBoxTel.Text = textBoxFirma.Text = string.Empty;
            textBoxFirma.Focus();
        }

        private Shipper selectedShipper;
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listBox1.SelectedItem != null)
            {
                selectedShipper = listBox1.SelectedItem as Shipper;
                textBoxFirma.Text = selectedShipper.CompanyName;
                textBoxTel.Text = selectedShipper.Phone;
            }
        }

        private void buttonYeni_Click(object sender, EventArgs e)
        {
            Clear();
        }

        private void buttonSil_Click(object sender, EventArgs e)
        {
            if (selectedShipper != null)
            {
                entities.Shippers.DeleteObject(selectedShipper);
                entities.SaveChanges();
                Clear();
            }
        }
Umarım faydalı olabilmişimdir. Bir başka yazıda görüşmek dileğiyle, hoşçakalın...