Uğur Tılıkoğlu

hello world

Eğer projenize, uzak bilgisayardan bir dll referansı verdiyseniz, projenizi derlediğinizde hatalar oluşabilmesi mümkün. Yapacağınız bir konfigürasyon ayarı ile bu hatalardan kurtulabilirsiniz.

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.config dosyasında, runtime sectionı altına <loadFromRemoteSources enabled=”true” /> kodunu ekleyip tüm Visual Studio 2010 instancelarını restart ediniz. Son hali aşağıdaki şekilde olmalıdır.

Eğer Visual Studio 2010 içerisinde TFS üzerinden get latest, check-in, check-out gibi işlemleri yaparken anormal bir yavaşlık yaşıyor iseniz, yapacağınız bir konfigürasyon ayarı ile bu yavaşlıktan kurtulabilirsiniz.

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.config dosyasında, system.net sectionı altına <defaultProxy enabled=”false”/> kodunu ekleyiniz ve çalışan tüm Visual Studio 2010 instancelarını restart ediniz. Son hali aşağıdaki şekilde olmalıdır.

Visual Studio 2010 IDE Config File

Bu ayar aynı zamanda, extension manager’ın online arama özelliğini de, çalışmıyor ise çalışır hale getirecektir.

Veritabanında tutmak istediğimiz integer tipini, eğer daha küçük boyutlarda saklamak istiyor isek, SQL Server üzerinde farklı integer tipleri ile oluşturabiliriz. Bunlardan en yaygın olanları smallint ve tinyint tipleridir.

Eğer, Entity Framework modelini veritabanından generate ediyor isek, model üzerinde oluşacak mapleri dikkatlice incelememiz gerekir. Özellikle veriyi kaydetme esnasında, The specified value is not an instance of type ‘Edm.Int16′ şeklinde bir hata alıyor isek, kaydettiğimiz entity üzerindeki ve bununla ilişkili diğer entityler üzerindeki smallint ve tinyint alanların üzerinde bazı değişiklikler yapmamız gerekir.

Otomatik oluşturulan modelde her iki tip de Byte olarak maplenmiştir. Oysa ki smallint için tavsiye edilen map tipi Int16′dır. Tüm smallint alanları Int16 olarak maplediğimiz, ya da veritabanındaki smallint alanları tinyint’e çevirip modeli güncellediğimizde, artık bu hata ile karşılaşmayacağız.

Test projenize, yeni bir test method eklediniz, sıra geldi sadece o methodu debug etmeye. Test List View penceresini açıyoruz, oops, yeni eklediğimiz methodu göremiyoruz.

Bu problem iki farklı şekilde çözülebilir.

  1. Tahmin ettiğiniz gibi, Visual Studio’yu restart etmek :)
  2. Tools – Options – Test Tools – Test Project penceresindeki “Disable background discovery of test methods” kutucuğunun işaretini kaldırmak ve Visual Studio’yu restart etmek. Bunu yaptığınızdan itibaren, eklediğiniz ve sildiğiniz her yeni test method, Test View ve Test List View ekranlarında güncellenecektir.

Merhaba,

Bu yazıda sizlere WCF servis katmanında, Entity Framework ile birlikte gelen Self Tracking Entity kullanımına dair yaptığım araştırmalar, geliştirdiğim örnekler ve karşılaştığım problemlerden bahsetmeye çalışacağım.

Bildiğiniz gibi, servis tabanlı projelerde birden fazla katman bulunmakta, client uygulama, iş mantığı ve bu iş mantıkları sonucu üretilen verilerin tamamı ayrı makinalarda çalışmakta ve yer almaktadır. Bunun sonucu olarak, bir katman diğerine ait kaynakları direkt olarak kullanamamakta ve iletişim kurallarının gereği olan bazı engellerle karşılaşmaktadır.

Bu problemi; veri katmanında Entity Framework kullanan bir örnek ile açıklayalım, ve Self Tracking Entity yapısının bu probleme nasıl bir çözüm getirdiğini görelim.

Şekil 1 – Katmanlı Mimari

Veri katmanında kullanacağımız örnek için, daha önceden oluşturmuş olduğumuz tabloları kullanacağız. Bu tabloları, projemize yeni bir Entity Framework modeli (EDMX) ekleyerek projemize taşıyalım.


Şekil 2 – Veri Modeli

İlk oluşan EDMX modelinin özelliklerinde, Code Generation Strategy = Default olarak bulunmaktadır. Bunun anlamı; EDMX modelinden faydalanılarak oluşturulan entity yapısı, Entity Framework’ün sağladığı default code generator ile oluşturulmuştur. Eğer default bir kod üretilmesini istemiyor isek, bu seçeneği None olarak işaretlememiz gerekir.

Şekil 3 – Model Properties

Öncelikle, default oluşan entity yapısına kısaca bir göz atalım ve bu entitylerin nerede bulunduğuna dikkat edelim. Model dosyası altında bulunan *.Designer.cs dosyasını açarsak, burada hem default ObjectContext, hem de default entity yapısı için oluşturulan kodları görebiliriz. Burada, entity ve context nesnesi, EDMX modeli ile sıkı sıkıya bağlıdır. Eğer biz bu entityleri Presentation katmanında kullanmak istersek, bu mümkün olmayacaktır. Presentation katmanına bu entityleri taşımak için, mecburen EDMX modelini de Presentation katmanına taşımamız gerekir ki, bu da çok katmanlı mimari bakış açısının istemediği, veri erişim ve iş mantığı yapılarının client makinalara gitmesi anlamına gelecektir.

Bu sebeple, Microsoft ve diğer üçüncü partiler tarafından T4 code generation templateleri kullanılarak, değişik amaçlara yönelik entity ve context templateleri oluşturulmuştur. Bu templatelerden bir tanesi de, Microsoft tarafından sağlanan Self Tracking Entity templateidir. Self Tracking Entity templatei tarafından oluşturulan entity nesneleri, WCF servisleri üzerinden her iki yöne hareket edebilen, ekranlara bind edilebilen, ekranlar üzerinde yapılan değişiklikleri kendi üzerinde takip edip, veri katmanında ise bu değişikleri veritabanına yansıtabilen yapılardır. Microsoft Patterns & Practices grubunun mimari tavsiye dökümanlarında tavsiye edilen DTO (Data Transformation Object) yapısı yerine, tamamen ekran hizmetlerine yönelik tasarlanan servislerde Self Tracking Entity yapısı kullanılması, geliştirme hızını artıracak ve yazılan kod miktarını azaltacaktır. Ancak unutulmamalıdır ki, bu yapı tamamen .NET teknolojileri ile geliştirilen ortamlarda çalışması amacıyla geliştirilmiştir, Java ve diğer teknolojiler ile geliştirilen uygulamalar, bu servisler ve entitylerden faydalanamayacaktır.

Self Tracking Entity yapısının kullanımı ve Servis Tabanlı Mimariye uygun hale getirilmesi

Self Tracking Entity yapısını kullanabilmek için, EDMX modeli üzerinde sağ tıklayıp, Add Code Generation Item menüsünden, ADO.NET Self-Tracking Entity Generator seçeneği ile T4 template oluşturulur.

 

Şekil 4 – Add Code Generation Item

T4 templatelerinin oluşması ile birlikte, EDMX model properties üzerindeki Code Generation Strategy özelliğinin otomatik olarak None değerine set edildiğini kontrol edebilirsiniz. Ayrıca model dosyasına bağlı *.Designer.cs dosyasının içerisinde de context ve entity tanımı içeren herhangi bir kod kalmadığını da görebilirsiniz.

Oluşan T4 templatelerini ve ürettiği kodların yapısını incelersek, Model.tt dosyası altında Self Tracking Entity yapıları ve bu entitylerin kullanacağı yardımcı interface, class ve extension methodların bulunduğunu; Model.Context.tt dosyası altında ise, bu entityleri yönetecek ObjectContext ve yardımcı extension methodların bulunduğunu görebiliriz.

Ancak, presentation katmanında bu entityleri bu haliyle kullanmak istersek, veri katmanına bir bağımlılık oluşturmak zorunda kalırız, ve bu bağımlılık bizim arzu ettiğimiz mimari yapıyı bozacaktır. Bu sebeple, Self Tracking Entityleri, hem presentation, hem servis, hem de veri katmanının erişebileceği ortak bir kütüphaneye taşımamız gerekmektedir. Bu da, örnek proje mimarisinde de görebileceğiniz Shared isimli kütüphanedir. Shared kütüphanesi, WCF servislerinin ve presentation katmanının kullanacağı service contract ve data contract yapılarının bulunacağı kütüphanedir.

Self Tracking Entity yapılarını Shared projesine taşımak için, Model.tt isimli T4 templateini o projeye taşımamızın dışında içerisindeki EDMX dosyasının yolunu belirten kısmı aşağıdaki şekilde değiştirmek yeterli olacaktır.

Şekil 5 – EDMX path

Self Tracking Entity ile kayıt işlemleri

Örneğimizi geliştirmeye Person nesnesi üzerinden başlayalım. Person nesnesini, eğer veritabanında yok ise veritabanına ekleyecek, eğer veritabanında mevcut ise yapılan değişiklikleri veritabanında güncelleyecek bir servis methodu yazalım.

Şekil 6 – SavePerson methodu

 

İlk olarak, Person nesnesinin tamamının değil, sadece primitive propertylerinin set edilerek ekrandan gönderildiğini varsayalım. Navigation propery ve collection propertyleri yazının ilerleyen kısımlarında inceleyeceğiz. SavePerson methodu için bu seviyedeki bir implementasyon aşağıdaki şekilde olacaktır.

Şekil 7 – SavePerson implementasyonu

Person nesnesi üzerinde ObjectChangeTracker tipinde ChangeTracker isimli bir property bulunmaktadır. Bu property üzerinde, nesnenin o anki durumu, hangi özelliklerinin değişikliğe uğradığı ve eski özelliklerinin değerleri bulunmaktadır. Bizim ilk gönderdiğimiz nesne, ekran tarafında oluşturulan yeni bir nesne olduğundan dolayı, statüsü Added olacaktır. ObjectState enum tipindedir ve alabileceği diğer değerler, Modified, Deleted ve Unchanged değerleridir.

Yukarıdaki implementasyonda kullanılan ApplyChanges methodu, Self Tracking Entity templatei ile gelmiş olan bir extension methoddur. Amacı, parametre olarak geçilen nesne üzerindeki değişiklikleri ChangeTracker vasıtasıyla tespit edip, context üzerindeki nesneye bu değişiklikleri yansıtmaktır. SaveChanges methodunun çağrılmasıyla birlikte bu değişiklikler veritabanına yansıtılır, ve eğer veritabanından bu nesneye aktarılacak özellikler varsa (autoincrement id gibi) aktarım yapılır. Ancak ilk gönderdiğimiz Person nesnesi, hala Added statüsündedir ve değişiklik yapılan alanlara dair bilgiler hala üzerinde mevcuttur. Eğer kayıt esnasında bir problem oluşmadı ise, artık bu nesne veritabanındaki nesne ile birebir eşittir, dolayısıyla durumunun Unchanged olması ve değişiklik takibiyle alakalı tüm özelliklerin temizlenmesi gerekmektedir. Kayıt sonrası yapılacak tüm bu temizlik işlemleri, yine Self Tracking Entity templatei ile gelen bir extension methodu olan AcceptChanges vasıtası ile yapılır. Bu ilk implementasyon ile kayıt işlemleri tamamlanır.

Servis tarafında nesne üzerinde oluşacak değişikliklerin Presentation katmanına yansıtılması

Person örneğinden gidersek, nesnemiz ekran tarafında Added statüsünde oluşturuldu, servis katmanı vasıtasıyla başka bir ortama taşındı ve veritabanına kaydedildi. Kayıt sonrasında ise, nesne üzerinde PersonRef isimli alana veritabanında üretilen bir numara aktarıldı, ve nesne statüsü Unchanged olarak değiştirildi. Tüm bu değişikliklerin ekran tarafına tekrar bildirilmesi gerekmektedir. Burada akla gelen ilk çözüm, servis methodunun Person nesnesinin son halini return etmesi, ekran tarafındaki nesneye de bu değişikliklerin yansıtılması olacaktır. Ancak bu örnekteki Person nesnesi basit bir nesne olabilir, gerçek uygulamalarda ise Person nesnesi kadar basit nesnelerle karşılaşmanızın zor olacağına, bu değişikliklerin yansıtılmasının da keza bir o kadar zor olacağına bahse girebilirim. İşte burada karşımıza, C# dilinin güzelliklerinden ref keywordu çıkıyor. Bir methoda parametre geçilen nesne, eğer ref vasıtası ile geçilir ise, method içerisinde o nesne üzerinde yapılacak her değişiklik asıl nesne üzerinde yapılacaktır. Servis ortamında bunun gerçekleşmesi biraz zor gibi gözükse de, WCF bu özelliği desteklemektedir.

Bu durumda bir önceki yazdığımız kodda yapılacak tek değişiklik, hem service interface, hem de implementasyon tarafındaki method imzasını aşağıdaki şekilde olduğu gibi ref keywordunu eklemek olacaktır. Böylelikle SaveChanges ve AcceptChanges methodlarını çağırdığımızda, nesne üzerinde gerçekleşen değişiklikler, ekran tarafındaki nesneye de direkt olarak yansıyacaktır. (Eğer binding kullanıldı ise ekran üzerinde de görülebilecektir)

Şekil 8 – ref kullanımı

 

Navigation Property bulunduran bir Self Tracking Entity ile kayıt işlemleri

Örneğimiz ile devam edelim. Ekran üzerinde, cinsiyet bilgisinin seçilebileceği bir combobox oluşturalım ve bu comboboxa, servis vasıtasıyla getirilecek olan Gender listesini dolduralım. Comboboxtan bir Gender seçilmesi ile birlikte de, bu Gender nesnesini Person nesnesi üzerindeki Gender nesnesine set edelim. Bu haliyle de Person nesnemizi kaydedelim.

WPF teknolojisi arkasındaki binding mekanizması, ekran ile arkasında kullanılan modeli birbirine bağlayarak, ekran üzerinde yapılan bir değişikliği anında modele, model üzerinde yapılan bir değişikliği de anında ekrana yansıtarak, hem bu işlemleri yapabilmek için yazılacak kod miktarını sıfıra indirmekte, hem de ekran-model arasındaki senkronizasyonu mükemmel derecede sağlamaktadır. Biz de örneğimizde, binding mekanizmasından faydalanıyor olacağız.

İlk olarak, combobox’a bağlayacağımız Gender listesini getiren servis methodunu ve implementasyonunu aşağıdaki şekilde oluşturalım.

Şekil 9 – Gender listesi

ObservableCollection nesnesi, WPF ekranlarına liste tipindeki nesneleri bind etmek için kullanılan bir yapıdır. Burada, gelen listeyi direkt olarak ekrana bind etmek amacıyla ObservableCollection kullanıyoruz.

Listenin comboboxa bind edilmesi ile birlikte, combobox içerisinde cinsiyet bilgileri listelenecektir. Burada seçim yapılan cinsiyet bilgisinin de aynı şekilde, Person nesnesinin Gender tipine bind edilmesi gerekir. Bunun için combobox üzerinde aşağıdakine benzer bir XAML kodu yazılması gerekmektedir.

Şekil 10 – Combobox bind işlemi

 

Comboboxta listelenen ve seçim yapıldığında Person nesnesi üzerine set edilen Gender nesnelerini debug esnasında inceleyelim. Bu nesnelerin tamamının Unchanged olduğuna dikkat etmek gerekir. Böylelikle, Person nesnesi üzerindeki Gender özelliği de Unchanged olarak servis methoduna geçecek, dolayısıyla veritabanına herhangi bir Gender bilgisi tekrar eklenmeyecektir. Eğer Gender entitysi, yanlışlıkla Added statüsüyle gönderilmiş olsaydı, veritabanına yeni bir primary key ile bir gender entity’si eklenmeye çalışılacaktı (autoincrement id olmasından dolayı).

Bu haliyle uygulamayı test edersek, başarılı bir şekilde çalıştığını göreceğiz. Ancak, uygulamayı birkaç kez aynı şekilde kayıt yapması için tetiklediğimizde, bir süre sonra “AcceptChanges cannot continue because the object’s key values conflict with another object in the ObjectStateManager” şekilde bir exception aldığımızı göreceğiz. Bunun sebebi, kayıt için gönderdiğimiz entity grafiği üzerinde, aynı primary keye sahip birden fazla nesne bulunmasıdır. Buna sebep olan ise, Gender nesnesinden Person nesnesine erişmeyi sağlayan geriye doğru olan referanstır. Eğer bu şekilde bir erişime ihtiyacımız yok ise, EDMX modeli üzerindeki bu geriye doğru olan referansı silerek bu problemi çözebiliriz. (Bu hataya sebep olan durumlar hakkında detaylı bilgi ve diğer çözüm yolları için Diego B Vega’nın yazmış olduğu makaleyi bu linkten okuyabilirsiniz: http://blogs.msdn.com/b/diego/archive/2010/10/06/self-tracking-entities-applychanges-and-duplicate-entities.aspx )

Şekil 11 – İlk oluşturulan model

Şekil 12 – Modelin Person referansı silindikten sonraki durumu

 

Modeli bu şekilde oluşturduktan sonra, T4 templatelerini ilgili değişiklikleri koda yansıtması için tekrar çalıştırıp, uygulamanın sorunsuz bir şekilde çalıştığını test edebilirsiniz.

Collection Property bulunduran bir Self Tracking Entity ile kayıt işlemleri

Örneğimize, Person nesnesi üzerinde bulunan Address bilgilerini girmek ve kaydetmek suretiyle devam edelim.

Ekran üzerinden Address girişini bir grid vasıtası ile yapalım. Öncelikle ilk dikkat etmemiz gereken, Person üzerindeki Address listesinin bir TrackableCollection olduğudur. TrackableCollection tipinin detaylarını incelediğimizde ise ObservableCollection tipinden miras aldığını göreceğiz. Dolayısı ile Person üzerindeki Address listesini WPF ekranındaki bir gride rahatlıkla bind edebilir ve ekran üzerinde yapılacak değişiklikleri takip edebiliriz. Grid üzerine bind etme örneğini aşağıda görebilirsiniz.

Şekil 13 – Grid bind işlemi

İlk oluşturduğumuz Person nesnesi üzerinde herhangi bir Address bilgisi olmadığından dolayı grid ilk aşamada boş olarak gelecektir. Ekran üzerine “Yeni Adres Ekle” isimli bir buton ekleyip, bu butonun Address collectionuna yeni bir Address nesnesi eklemesini sağlayarak, Person üzerindeki listeye yeni bir Address satırı eklendiğini hem ekranda, hem de nesne üzerinde görebiliriz.

Şekil 14 – Collectiona yeni nesne eklenmesi

Yeni eklediğimiz Address nesnesi üzerindeki bilgileri değiştirip, SavePerson methodunu tekrar çağıralım. Address nesnesi veritabanına eklenecek, veritabanından alabileceği değerler ekranda güncellenecektir. Ancak nesneyi biraz daha incelersek, statüsünün kaydedilmesine rağmen hala Added olduğunu göreceğiz. Oysa ki kayıt işlemi sonrasında, statü ve diğer değişiklik takibi ile ilgili bilgileri temizlemek için Person nesnesi için AcceptChanges methodunu çağırmıştık. AcceptChanges methodunu derinlemesine incelersek, bu temizlik işlemini sadece çağrıldığı nesne için yaptığını göreceğiz. Dolayısıyla bu nesne altında bulunan liste tipindeki diğer nesnelerin her biri için AcceptChanges methodunu çağırmamız gerekir.

Şekil 15 – Address listesi için AcceptChanges methodunun çağrımı

 

Bu değişiklikle beraber, uygulamamızın sorunsuz bir şekilde çalıştığını test edebiliriz. Bu örnek için çalışan bu kod parçası, Person ya da Address nesnesi üzerine yeni collection propertyler eklendiğinde de çalışacak mıdır? Cevap hayır, bu durumda bu entity ağacındaki tüm nesnelerin collectionlarını tek tek foreach ile dönerek, AcceptChanges methodunu çağırmamız gerekecektir. Bu tip bir geliştirmenin de, karmaşık entity ağaçlarında aynı şekilde karmaşık kodlar yazılmasına sebep olacağı aşikardır.

İşte burada karşımıza Iterator ve Visitor patternleri çıkmaktadır. Iterator Pattern, bir yapının alt parçaları üzerinde gezmeyi sağlayan patterndir. Visitor Pattern ise, gezilen bu parçaların üzerinde işlemler yapılmasını sağlayan patterndir. Bu iki patterni kullarak, tüm Person nesnesi üzerindeki alt nesneleri gezen ve AcceptChanges methodunu çağıran bir yapı geliştirebiliriz. (Buna benzer bir yapının nasıl geliştirileceğine dair bilgiye, Jeff Derstadt’ın yazmış olduğu bu makaleden ulaşabilirsiniz: http://blogs.msdn.com/b/adonet/archive/2010/06/02/working-with-sets-of-self-tracking-entities.aspx . Makalenin en altında bulunan Iterator.tt isimli T4 templateini gerekli değişiklikleri yaparak projenize dahil edebilirsiniz)

Iterator yapının geliştirilmesinden sonra, tüm nesneler için AcceptChanges methodunu çağıracak, AcceptAllChanges isimli bir method aşağıdaki şekilde geliştirilebilir. Böylelikle SavePerson methodundaki foreach döngüsü tamamen kaldırılabilir, AcceptChanges methodu yerine de bu yeni method çağrılarak kodumuz gelişmeye açık bir hale getirilebilir.

Şekil 16 – AcceptAllChanges methodu

Şekil 17 – SavePerson methodunun son hali

 

Self Tracking Entity içerisindeki Collection Property’e ait bir nesnenin değiştirilmesi

Örneğimizin çalışan son hali ile, Person nesnesi içerisinde birden fazla Address nesnesi ekleyelim ve kaydedelim. Yeni eklediğimiz nesnelerin tamamının, servis methoduna Added statüsü ile ulaşacağını ve kayıt işleminden sonra AcceptAllChanges methodunun çağrılması ile birlikte Unchanged statüsü ile yaşamlarına devam edeceklerini hatırlayalım.

Eklediğimiz bir Address nesnesi üzerinde değişiklik yapalım ve debug esnasında statüsünü kontrol edelim. Nesnenin statüsünün Modified olarak değiştiğini göreceğiz. Bunu sağlayan yapının arkasında, INotifyPropertyChanged interfacei ve binding mekanizması bulunmaktadır. Ekran üzerinde değişikliği yaptığımız anda, binding vasıtasi ile bu değişiklik nesnenin ilgili propertysine yansıtılmış, bu propertynin değiştiğine dair bir bildirim mekanizması ise OnPropertyChanged eventi vasıtasıyla devreye girmiştir. Bu eventin çalıştırdığı kod parçacığını incelediğimizde ise, statüyü Modified olarak değiştiren yapıyı görebiliriz.

Person nesnesini, SavePerson methodu üzerinde herhangi bir değişiklik yapmadan bu haliyle kaydedebiliriz. Değişiklik yapılan Address nesnesi üzerindeki propertyler, veritabanında güncellenecektir.

 

Self Tracking Entity içerisindeki Collection Property’e ait bir nesnenin silinmesi

Person nesnesine ait Address nesnelerinden bir tanesinin silinmesi için, öncelikle ekran tarafında silme işlemini tetikleyecek “Seçili Adresi Sil” isimli bir buton yerleştirelim ve aşağıdaki kod parçasına benzer bir yapıyı çalıştırmasını sağlayalım.

Şekil 18 – Address nesnesini silme denemesi

Bu hali ile uygulamamızı çalıştırarak, bir tane Address nesnesini silerek SavePerson methodunu çağıralım ve veritabanından kontrol edelim. Address nesnesinin ekrandan silindiğini, ancak veritabanında hala bulunduğunu göreceğiz. Bunun sebebi, Address nesnesini collectiondan tamamen sildiğimizden, ApplyChanges methodunun böyle bir nesneden haberi olmaması ve dolayısıyla silineceğini de bilmemesidir. Bir nesnenin silineceğine dair bilgi ise, nesne üzerindeki MarkAsDeleted methodu ile o nesne üzerine aktarılır. Ekran tarafıdaki kodu aşağıdaki şekilde değiştirelim.

Şekil 19 – Address nesnesini silme denemesi

Bu hali ile tekrar çalıştıralım ve Address nesnesini silmek için butona tıklayalım. Ekranda ve daha sonrasında debug aşamasında görüleceği üzere, nesne Deleted olarak işaretlenmesine rağmen ekrandan silinmemiştir. Bunun sebebi, nesnenin hala collection üzerinden bulunuyor olmasıdır. Son kullanıcının kafasının karışmasını engellemek ve bu nesneyi ekrandan silmek için, grid üzerine aşağıdakine benzer bir filtre ekleyebiliriz.

Şekil 20 – Silinen Address nesneleri için grid filtresi

Bu filtreyi de ekledikten sonra uygulamamızı tekrar test edersek, silinen Address nesnelerinin hem ekrandan, hem de veritabanından başarıyla silindiğini göreceğiz. Böylelikle, collection içerisindeki bir nesneyi silmek için onu collectiondan remove etmek değil, onu MarkAsDeleted methodu ile Deleted olarak işaretlememiz gerektiğini öğrendik. Bu tip manuel statü değişiklikleri uygulamak amacı ile, nesne üzerinde aşağıdaki extension methodlar bulunmaktadır.

Şekil 21 – MarkAs methodları

Sonuç

Geliştirdiğimiz örnekle birlikte, Self Tracking Entity’lerin nasıl kullanıldığını, servis tabanlı kullanıma nasıl uygun hale getirildiğini, CRUD işlemlerin (kaydetme-değiştirme-silme) nasıl yapılabileceğini ve karşılaşılması muhtemel problemleri incelemiş olduk.

Notlar:

  • Ekran geliştirme esnasında kullanılan grid ve combobox nesneleri DevExpress firmasının WPF componentleridir.
  • Yazı Entity Framework’e ait Self Tracking Entity yapısını anlatmayı amaçladığından, WPF ve WCF’in kullanımına dair detaylar içermemektedir.

 

Kaynaklar:

 

 

 

Javascript ile 535 farklı şekilde sayfa yenileyebileceğinizi biliyor muydunuz? :)

 1.location = location
 2.location = location.href
 3.location = window.location
 4.location = self.location
 5.location = window.location.href
 6.location = self.location.href
 7.location = location['href']
 8.location = window['location']
 9.location = window['location'].href
 10.location = window['location']['href']
 11.location = window.location['href']
 12.location = self['location']
 13.location = self['location'].href
 14.location = self['location']['href']
 15.location = self.location['href']
 16.location.assign(location)
 17.location.replace(location)
 18.window.location.assign(location)
 19.window.location.replace(location)
 20.self.location.assign(location)
 21.self.location.replace(location)
 22.location['assign'](location)
 23.location['replace'](location)
 24.window.location['assign'](location)
 25.window.location['replace'](location)
 26.window['location'].assign(location)
 27.window['location'].replace(location)
 28.window['location']['assign'](location)
 29.window['location']['replace'](location)
 30.self.location['assign'](location)
 31.self.location['replace'](location)
 32.self['location'].assign(location)
 33.self['location'].replace(location)
 34.self['location']['assign'](location)
 35.self['location']['replace'](location)
 36.location.href = location
 37.location.href = location.href
 38.location.href = window.location
 39.location.href = self.location
 40.location.href = window.location.href
 41.location.href = self.location.href
 42.location.href = location['href']
 43.location.href = window['location']
 44.location.href = window['location'].href
 45.location.href = window['location']['href']
 46.location.href = window.location['href']
 47.location.href = self['location']
 48.location.href = self['location'].href
 49.location.href = self['location']['href']
 50.location.href = self.location['href']
 51.location.assign(location.href)
 52.location.replace(location.href)
 53.window.location.assign(location.href)
 54.window.location.replace(location.href)
 55.self.location.assign(location.href)
 56.self.location.replace(location.href)
 57.location['assign'](location.href)
 58.location['replace'](location.href)
 59.window.location['assign'](location.href)
 60.window.location['replace'](location.href)
 61.window['location'].assign(location.href)
 62.window['location'].replace(location.href)
 63.window['location']['assign'](location.href)
 64.window['location']['replace'](location.href)
 65.self.location['assign'](location.href)
 66.self.location['replace'](location.href)
 67.self['location'].assign(location.href)
 68.self['location'].replace(location.href)
 69.self['location']['assign'](location.href)
 70.self['location']['replace'](location.href)
 71.window.location = location
 72.window.location = location.href
 73.window.location = window.location
 74.window.location = self.location
 75.window.location = window.location.href
 76.window.location = self.location.href
 77.window.location = location['href']
 78.window.location = window['location']
 79.window.location = window['location'].href
 80.window.location = window['location']['href']
 81.window.location = window.location['href']
 82.window.location = self['location']
 83.window.location = self['location'].href
 84.window.location = self['location']['href']
 85.window.location = self.location['href']
 86.location.assign(window.location)
 87.location.replace(window.location)
 88.window.location.assign(window.location)
 89.window.location.replace(window.location)
 90.self.location.assign(window.location)
 91.self.location.replace(window.location)
 92.location['assign'](window.location)
 93.location['replace'](window.location)
 94.window.location['assign'](window.location)
 95.window.location['replace'](window.location)
 96.window['location'].assign(window.location)
 97.window['location'].replace(window.location)
 98.window['location']['assign'](window.location)
 99.window['location']['replace'](window.location)
 100.self.location['assign'](window.location)
 101.self.location['replace'](window.location)
 102.self['location'].assign(window.location)
 103.self['location'].replace(window.location)
 104.self['location']['assign'](window.location)
 105.self['location']['replace'](window.location)
 106.self.location = location
 107.self.location = location.href
 108.self.location = window.location
 109.self.location = self.location
 110.self.location = window.location.href
 111.self.location = self.location.href
 112.self.location = location['href']
 113.self.location = window['location']
 114.self.location = window['location'].href
 115.self.location = window['location']['href']
 116.self.location = window.location['href']
 117.self.location = self['location']
 118.self.location = self['location'].href
 119.self.location = self['location']['href']
 120.self.location = self.location['href']
 121.location.assign(self.location)
 122.location.replace(self.location)
 123.window.location.assign(self.location)
 124.window.location.replace(self.location)
 125.self.location.assign(self.location)
 126.self.location.replace(self.location)
 127.location['assign'](self.location)
 128.location['replace'](self.location)
 129.window.location['assign'](self.location)
 130.window.location['replace'](self.location)
 131.window['location'].assign(self.location)
 132.window['location'].replace(self.location)
 133.window['location']['assign'](self.location)
 134.window['location']['replace'](self.location)
 135.self.location['assign'](self.location)
 136.self.location['replace'](self.location)
 137.self['location'].assign(self.location)
 138.self['location'].replace(self.location)
 139.self['location']['assign'](self.location)
 140.self['location']['replace'](self.location)
 141.window.location.href = location
 142.window.location.href = location.href
 143.window.location.href = window.location
 144.window.location.href = self.location
 145.window.location.href = window.location.href
 146.window.location.href = self.location.href
 147.window.location.href = location['href']
 148.window.location.href = window['location']
 149.window.location.href = window['location'].href
 150.window.location.href = window['location']['href']
 151.window.location.href = window.location['href']
 152.window.location.href = self['location']
 153.window.location.href = self['location'].href
 154.window.location.href = self['location']['href']
 155.window.location.href = self.location['href']
 156.location.assign(window.location.href)
 157.location.replace(window.location.href)
 158.window.location.assign(window.location.href)
 159.window.location.replace(window.location.href)
 160.self.location.assign(window.location.href)
 161.self.location.replace(window.location.href)
 162.location['assign'](window.location.href)
 163.location['replace'](window.location.href)
 164.window.location['assign'](window.location.href)
 165.window.location['replace'](window.location.href)
 166.window['location'].assign(window.location.href)
 167.window['location'].replace(window.location.href)
 168.window['location']['assign'](window.location.href)
 169.window['location']['replace'](window.location.href)
 170.self.location['assign'](window.location.href)
 171.self.location['replace'](window.location.href)
 172.self['location'].assign(window.location.href)
 173.self['location'].replace(window.location.href)
 174.self['location']['assign'](window.location.href)
 175.self['location']['replace'](window.location.href)
 176.self.location.href = location
 177.self.location.href = location.href
 178.self.location.href = window.location
 179.self.location.href = self.location
 180.self.location.href = window.location.href
 181.self.location.href = self.location.href
 182.self.location.href = location['href']
 183.self.location.href = window['location']
 184.self.location.href = window['location'].href
 185.self.location.href = window['location']['href']
 186.self.location.href = window.location['href']
 187.self.location.href = self['location']
 188.self.location.href = self['location'].href
 189.self.location.href = self['location']['href']
 190.self.location.href = self.location['href']
 191.location.assign(self.location.href)
 192.location.replace(self.location.href)
 193.window.location.assign(self.location.href)
 194.window.location.replace(self.location.href)
 195.self.location.assign(self.location.href)
 196.self.location.replace(self.location.href)
 197.location['assign'](self.location.href)
 198.location['replace'](self.location.href)
 199.window.location['assign'](self.location.href)
 200.window.location['replace'](self.location.href)
 201.window['location'].assign(self.location.href)
 202.window['location'].replace(self.location.href)
 203.window['location']['assign'](self.location.href)
 204.window['location']['replace'](self.location.href)
 205.self.location['assign'](self.location.href)
 206.self.location['replace'](self.location.href)
 207.self['location'].assign(self.location.href)
 208.self['location'].replace(self.location.href)
 209.self['location']['assign'](self.location.href)
 210.self['location']['replace'](self.location.href)
 211.location['href'] = location
 212.location['href'] = location.href
 213.location['href'] = window.location
 214.location['href'] = self.location
 215.location['href'] = window.location.href
 216.location['href'] = self.location.href
 217.location['href'] = location['href']
 218.location['href'] = window['location']
 219.location['href'] = window['location'].href
 220.location['href'] = window['location']['href']
 221.location['href'] = window.location['href']
 222.location['href'] = self['location']
 223.location['href'] = self['location'].href
 224.location['href'] = self['location']['href']
 225.location['href'] = self.location['href']
 226.location.assign(location['href'])
 227.location.replace(location['href'])
 228.window.location.assign(location['href'])
 229.window.location.replace(location['href'])
 230.self.location.assign(location['href'])
 231.self.location.replace(location['href'])
 232.location['assign'](location['href'])
 233.location['replace'](location['href'])
 234.window.location['assign'](location['href'])
 235.window.location['replace'](location['href'])
 236.window['location'].assign(location['href'])
 237.window['location'].replace(location['href'])
 238.window['location']['assign'](location['href'])
 239.window['location']['replace'](location['href'])
 240.self.location['assign'](location['href'])
 241.self.location['replace'](location['href'])
 242.self['location'].assign(location['href'])
 243.self['location'].replace(location['href'])
 244.self['location']['assign'](location['href'])
 245.self['location']['replace'](location['href'])
 246.window['location'] = location
 247.window['location'] = location.href
 248.window['location'] = window.location
 249.window['location'] = self.location
 250.window['location'] = window.location.href
 251.window['location'] = self.location.href
 252.window['location'] = location['href']
 253.window['location'] = window['location']
 254.window['location'] = window['location'].href
 255.window['location'] = window['location']['href']
 256.window['location'] = window.location['href']
 257.window['location'] = self['location']
 258.window['location'] = self['location'].href
 259.window['location'] = self['location']['href']
 260.window['location'] = self.location['href']
 261.location.assign(window['location'])
 262.location.replace(window['location'])
 263.window.location.assign(window['location'])
 264.window.location.replace(window['location'])
 265.self.location.assign(window['location'])
 266.self.location.replace(window['location'])
 267.location['assign'](window['location'])
 268.location['replace'](window['location'])
 269.window.location['assign'](window['location'])
 270.window.location['replace'](window['location'])
 271.window['location'].assign(window['location'])
 272.window['location'].replace(window['location'])
 273.window['location']['assign'](window['location'])
 274.window['location']['replace'](window['location'])
 275.self.location['assign'](window['location'])
 276.self.location['replace'](window['location'])
 277.self['location'].assign(window['location'])
 278.self['location'].replace(window['location'])
 279.self['location']['assign'](window['location'])
 280.self['location']['replace'](window['location'])
 281.window['location'].href = location
 282.window['location'].href = location.href
 283.window['location'].href = window.location
 284.window['location'].href = self.location
 285.window['location'].href = window.location.href
 286.window['location'].href = self.location.href
 287.window['location'].href = location['href']
 288.window['location'].href = window['location']
 289.window['location'].href = window['location'].href
 290.window['location'].href = window['location']['href']
 291.window['location'].href = window.location['href']
 292.window['location'].href = self['location']
 293.window['location'].href = self['location'].href
 294.window['location'].href = self['location']['href']
 295.window['location'].href = self.location['href']
 296.location.assign(window['location'].href)
 297.location.replace(window['location'].href)
 298.window.location.assign(window['location'].href)
 299.window.location.replace(window['location'].href)
 300.self.location.assign(window['location'].href)
 301.self.location.replace(window['location'].href)
 302.location['assign'](window['location'].href)
 303.location['replace'](window['location'].href)
 304.window.location['assign'](window['location'].href)
 305.window.location['replace'](window['location'].href)
 306.window['location'].assign(window['location'].href)
 307.window['location'].replace(window['location'].href)
 308.window['location']['assign'](window['location'].href)
 309.window['location']['replace'](window['location'].href)
 310.self.location['assign'](window['location'].href)
 311.self.location['replace'](window['location'].href)
 312.self['location'].assign(window['location'].href)
 313.self['location'].replace(window['location'].href)
 314.self['location']['assign'](window['location'].href)
 315.self['location']['replace'](window['location'].href)
 316.window['location']['href'] = location
 317.window['location']['href'] = location.href
 318.window['location']['href'] = window.location
 319.window['location']['href'] = self.location
 320.window['location']['href'] = window.location.href
 321.window['location']['href'] = self.location.href
 322.window['location']['href'] = location['href']
 323.window['location']['href'] = window['location']
 324.window['location']['href'] = window['location'].href
 325.window['location']['href'] = window['location']['href']
 326.window['location']['href'] = window.location['href']
 327.window['location']['href'] = self['location']
 328.window['location']['href'] = self['location'].href
 329.window['location']['href'] = self['location']['href']
 330.window['location']['href'] = self.location['href']
 331.location.assign(window['location']['href'])
 332.location.replace(window['location']['href'])
 333.window.location.assign(window['location']['href'])
 334.window.location.replace(window['location']['href'])
 335.self.location.assign(window['location']['href'])
 336.self.location.replace(window['location']['href'])
 337.location['assign'](window['location']['href'])
 338.location['replace'](window['location']['href'])
 339.window.location['assign'](window['location']['href'])
 340.window.location['replace'](window['location']['href'])
 341.window['location'].assign(window['location']['href'])
 342.window['location'].replace(window['location']['href'])
 343.window['location']['assign'](window['location']['href'])
 344.window['location']['replace'](window['location']['href'])
 345.self.location['assign'](window['location']['href'])
 346.self.location['replace'](window['location']['href'])
 347.self['location'].assign(window['location']['href'])
 348.self['location'].replace(window['location']['href'])
 349.self['location']['assign'](window['location']['href'])
 350.self['location']['replace'](window['location']['href'])
 351.window.location['href'] = location
 352.window.location['href'] = location.href
 353.window.location['href'] = window.location
 354.window.location['href'] = self.location
 355.window.location['href'] = window.location.href
 356.window.location['href'] = self.location.href
 357.window.location['href'] = location['href']
 358.window.location['href'] = window['location']
 359.window.location['href'] = window['location'].href
 360.window.location['href'] = window['location']['href']
 361.window.location['href'] = window.location['href']
 362.window.location['href'] = self['location']
 363.window.location['href'] = self['location'].href
 364.window.location['href'] = self['location']['href']
 365.window.location['href'] = self.location['href']
 366.location.assign(window.location['href'])
 367.location.replace(window.location['href'])
 368.window.location.assign(window.location['href'])
 369.window.location.replace(window.location['href'])
 370.self.location.assign(window.location['href'])
 371.self.location.replace(window.location['href'])
 372.location['assign'](window.location['href'])
 373.location['replace'](window.location['href'])
 374.window.location['assign'](window.location['href'])
 375.window.location['replace'](window.location['href'])
 376.window['location'].assign(window.location['href'])
 377.window['location'].replace(window.location['href'])
 378.window['location']['assign'](window.location['href'])
 379.window['location']['replace'](window.location['href'])
 380.self.location['assign'](window.location['href'])
 381.self.location['replace'](window.location['href'])
 382.self['location'].assign(window.location['href'])
 383.self['location'].replace(window.location['href'])
 384.self['location']['assign'](window.location['href'])
 385.self['location']['replace'](window.location['href'])
 386.self['location'] = location
 387.self['location'] = location.href
 388.self['location'] = window.location
 389.self['location'] = self.location
 390.self['location'] = window.location.href
 391.self['location'] = self.location.href
 392.self['location'] = location['href']
 393.self['location'] = window['location']
 394.self['location'] = window['location'].href
 395.self['location'] = window['location']['href']
 396.self['location'] = window.location['href']
 397.self['location'] = self['location']
 398.self['location'] = self['location'].href
 399.self['location'] = self['location']['href']
 400.self['location'] = self.location['href']
 401.location.assign(self['location'])
 402.location.replace(self['location'])
 403.window.location.assign(self['location'])
 404.window.location.replace(self['location'])
 405.self.location.assign(self['location'])
 406.self.location.replace(self['location'])
 407.location['assign'](self['location'])
 408.location['replace'](self['location'])
 409.window.location['assign'](self['location'])
 410.window.location['replace'](self['location'])
 411.window['location'].assign(self['location'])
 412.window['location'].replace(self['location'])
 413.window['location']['assign'](self['location'])
 414.window['location']['replace'](self['location'])
 415.self.location['assign'](self['location'])
 416.self.location['replace'](self['location'])
 417.self['location'].assign(self['location'])
 418.self['location'].replace(self['location'])
 419.self['location']['assign'](self['location'])
 420.self['location']['replace'](self['location'])
 421.self['location'].href = location
 422.self['location'].href = location.href
 423.self['location'].href = window.location
 424.self['location'].href = self.location
 425.self['location'].href = window.location.href
 426.self['location'].href = self.location.href
 427.self['location'].href = location['href']
 428.self['location'].href = window['location']
 429.self['location'].href = window['location'].href
 430.self['location'].href = window['location']['href']
 431.self['location'].href = window.location['href']
 432.self['location'].href = self['location']
 433.self['location'].href = self['location'].href
 434.self['location'].href = self['location']['href']
 435.self['location'].href = self.location['href']
 436.location.assign(self['location'].href)
 437.location.replace(self['location'].href)
 438.window.location.assign(self['location'].href)
 439.window.location.replace(self['location'].href)
 440.self.location.assign(self['location'].href)
 441.self.location.replace(self['location'].href)
 442.location['assign'](self['location'].href)
 443.location['replace'](self['location'].href)
 444.window.location['assign'](self['location'].href)
 445.window.location['replace'](self['location'].href)
 446.window['location'].assign(self['location'].href)
 447.window['location'].replace(self['location'].href)
 448.window['location']['assign'](self['location'].href)
 449.window['location']['replace'](self['location'].href)
 450.self.location['assign'](self['location'].href)
 451.self.location['replace'](self['location'].href)
 452.self['location'].assign(self['location'].href)
 453.self['location'].replace(self['location'].href)
 454.self['location']['assign'](self['location'].href)
 455.self['location']['replace'](self['location'].href)
 456.self['location']['href'] = location
 457.self['location']['href'] = location.href
 458.self['location']['href'] = window.location
 459.self['location']['href'] = self.location
 460.self['location']['href'] = window.location.href
 461.self['location']['href'] = self.location.href
 462.self['location']['href'] = location['href']
 463.self['location']['href'] = window['location']
 464.self['location']['href'] = window['location'].href
 465.self['location']['href'] = window['location']['href']
 466.self['location']['href'] = window.location['href']
 467.self['location']['href'] = self['location']
 468.self['location']['href'] = self['location'].href
 469.self['location']['href'] = self['location']['href']
 470.self['location']['href'] = self.location['href']
 471.location.assign(self['location']['href'])
 472.location.replace(self['location']['href'])
 473.window.location.assign(self['location']['href'])
 474.window.location.replace(self['location']['href'])
 475.self.location.assign(self['location']['href'])
 476.self.location.replace(self['location']['href'])
 477.location['assign'](self['location']['href'])
 478.location['replace'](self['location']['href'])
 479.window.location['assign'](self['location']['href'])
 480.window.location['replace'](self['location']['href'])
 481.window['location'].assign(self['location']['href'])
 482.window['location'].replace(self['location']['href'])
 483.window['location']['assign'](self['location']['href'])
 484.window['location']['replace'](self['location']['href'])
 485.self.location['assign'](self['location']['href'])
 486.self.location['replace'](self['location']['href'])
 487.self['location'].assign(self['location']['href'])
 488.self['location'].replace(self['location']['href'])
 489.self['location']['assign'](self['location']['href'])
 490.self['location']['replace'](self['location']['href'])
 491.self.location['href'] = location
 492.self.location['href'] = location.href
 493.self.location['href'] = window.location
 494.self.location['href'] = self.location
 495.self.location['href'] = window.location.href
 496.self.location['href'] = self.location.href
 497.self.location['href'] = location['href']
 498.self.location['href'] = window['location']
 499.self.location['href'] = window['location'].href
 500.self.location['href'] = window['location']['href']
 501.self.location['href'] = window.location['href']
 502.self.location['href'] = self['location']
 503.self.location['href'] = self['location'].href
 504.self.location['href'] = self['location']['href']
 505.self.location['href'] = self.location['href']
 506.location.assign(self.location['href'])
 507.location.replace(self.location['href'])
 508.window.location.assign(self.location['href'])
 509.window.location.replace(self.location['href'])
 510.self.location.assign(self.location['href'])
 511.self.location.replace(self.location['href'])
 512.location['assign'](self.location['href'])
 513.location['replace'](self.location['href'])
 514.window.location['assign'](self.location['href'])
 515.window.location['replace'](self.location['href'])
 516.window['location'].assign(self.location['href'])
 517.window['location'].replace(self.location['href'])
 518.window['location']['assign'](self.location['href'])
 519.window['location']['replace'](self.location['href'])
 520.self.location['assign'](self.location['href'])
 521.self.location['replace'](self.location['href'])
 522.self['location'].assign(self.location['href'])
 523.self['location'].replace(self.location['href'])
 524.self['location']['assign'](self.location['href'])
 525.self['location']['replace'](self.location['href'])
 526.location.reload()
 527.location['reload']()
 528.window.location.reload()
 529.window['location'].reload()
 530.window.location['reload']()
 531.window['location']['reload']()
 532.self.location.reload()
 533.self['location'].reload()
 534.self.location['reload']()
 535.self['location']['reload']()

Metallica’nın en sevdiğim şarkılarından bir tanesidir. Özellikle S&M albümündeki yorum çok farklı, rock ya da metal müzikten hoşlanlamayan arkadaşların tüm önyargılarını bir tarafa bırakarak, bir kez olsun dinlemelerini tavsiye ederim.

..and the road becomes my bride
…and the road becomes my bride
I have stripped of all but pride
so in her I do confide
and she keeps me satisfied
gives me all I need

…and with dust in throat I crave
only knowledge will I save
to the game you stay a slave
rover wanderer
nomad vagabond
call me what you will

but I’ll take my time anywhere
free to speak my mind anywhere
and I’ll redefine anywhere
anywhere I may road
where I lay my head is home

…and the earth becomes my throne
…and the earth becomes my throne
I adapt to the unknown
under wandering stars I’ve grown
by myself but not alone
I ask no one

…and my ties are severed clean
the less I have the more I gain
off the beaten path I reign
rover wanderer
nomad vagabond
call me what you will

but i’ll take my time anywhere
free to speak my mind
and I’ll take my find anywhere
anywhere I may roam
where I lay my head is home

carved upon my stone
my body lie, but still I roam
wherever I may roam

CETURK Java Teknolojileri Günü – Bahçeşehir Üniversitesi
Bugüne kadar çok farklı konu ve teknoloji ile ilgili yaptığı ücretsiz etkinliklerle bilişim sektörünün gelişmesine katkıda bulunan CETURK etkinliklerine devam ediyor.

Şubat ayında 6. yaşını kutlayan CETURK, 7 Şubat’ta Microsoft Türkiye İstanbul Ofisi‘nde CETURK Microsoft Teknolojileri Etkinliği , 28 Şubat’ta IBM Türk‘te "CETURK Çevik Süreç ve TDD Günü " etkinliği ardından 15 Mart’ta Inomera A.Ş. ve Prime Teknoloji sponsorluğunda Bahçeşehir Üniversitesi Yazılım & Bilişim Kulübü işbirliği ile "CETURK Java Teknolojileri Günü – Bahçeşehir Üniversitesi" etkinliği düzenleniyor. Etkinliğe Java dünyasının çok önemli ve değerli konuşmacıları bilgi ve tecrübelerini katılımcılarla paylaşacaklar.

  • Ahmet Başaran – Inomera A.Ş.
  • Cihan Uluışık – Erenet Yazılım
  • Altuğ B. Altıntaş -Java Teknolojileri ve Programcıları Derneği
  • Çağatay Çivici – Prime Tekonoloji
  • Muharrem Taç – Martı Yazılım

Etkinliğe katılım her zamanki gibi ücretsiz olacaktır. Ayrıca her zaman olduğu gibi etkinliğe katılanlara çekiliş ile kitap hediye edilecektir.

Ayrıntılı bilgi ve kayıt için : http://www.ceturk.com/etkinlikkayit.asp?id=65

7 Mart 2009 Cumartesi günü, Işık Üniversitesi’nde düzenlenecek olan Çevik Java EE 5 Web Uygulamaları ve Mimarileri konulu seminere katılmayı düşünüyorum. Java ile uygulama geliştirmede yaygın olan pek çok teknolojinin pratik olarak uygulanacağı bu seminerde; “biz böyle yapıyoruz, peki aslında nasıl yapılıyor?” sorusuna cevap alabilmeyi umuyorum.

Ayrıntılı bilgi için

http://www.kurumsaljava.com/2009/02/03/cevik-java-ee-5-web-uygulamalari-ve-mimarileri-semineri/

Sun Application Server, ya da GlassFish ESB web admin konsoluna giriş yapmaya çalıştığınız zaman hata alıyorsanız, küçük bir konfigürasyon ayarı yapmanız gerekiyor.

Application server domaininizin config klasörü içerisinde bulunan domain.xml isimli dosyanın yerini tespit edin.

Örnek:

C:\sun\SDK\domains\domain1\config\domain.xml

C:\GlassFishESB\glassfish\domains\domain1\config\domain.xml

Bu dosya içerisindeki </java-config> tagını aratın ve bir üst satırına, jvm’nizin Türkçe dil ayarlarını kullanabilmesi için aşağıdaki satırı ekleyin ve kaydedin.

<jvm-options>-Duser.language=tr-TR</jvm-options>

Application serverınızı yeniden başlattığınızda, artık web admin konsolunu kullanabiliyor olacaksınız.

İyi çalışmalar