19 Ağustos 2016 Cuma

EF Context'i güncellemek

Veritabanı bağlantısı için Entity Framework kullandığım bir web sayfasında garip bir problemle karşılaştım. SQL Server Management Studio ile veritabanına bağlanarak bir kaydı değiştirdiğimde, bu değişikliğin web sayfasına yansımadığını fark ettim. İnternet servis sağlayıcısına bu durumdan bahsedince onlar web sitesini kapatıp açtılar ve değişiklik web sitesine yansıdı. Uzun zamandır kafamı kurcalayan bu problemin çözümünü az önce buldum.

[1]

Entity Framework (EF), veritabanından getirdiği verinin bir kopyasını sunucu bilgisayarın hafızasında tutuyor ve bu kopyaya "EF Context" adı veriliyor. Eğer veritabanında EF dışında bir kaynak tarafından bir değişiklik yapılırsa EF bunu algılayamıyor. EF Context üzerinde bir değişiklik olmadığı sürece veritabanındaki veriler yerine EF Context içerisindeki veriler kullanılıyor. Benim karşılaştığım problem bundan kaynaklanıyormuş. Web sayfasını ilk açtığımda veritabanındaki veriler EF Context içerisine yazılıyor ve veritabanı üzerinde ben SQL Server Management Studio ile değişiklik yapsam bile bu değişiklik EF Context içerisindeki verilere yansımadığı için bu değişiklikler web sitesinde görünmüyormuş.

Bu problem EF uzmanları için kolay bir problem olabilir ama EF konusunda ben henüz yeni olduğum için yavaş yavaş öğreniyorum :)

Peki çözüm ne?

Çözüm, SQL Server Management Studio ile veya veritabanındaki bir Stored Procedure ile veritabanında değişiklik yapıldıktan sonra EF Context'in güncellenmesi... Bunun için aşağıdaki kod kullanılabilir:

public void RefreshAll()
{
     // Get all objects in statemanager with entityKey
     // (context.Refresh will throw an exception otherwise)
     var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(
                                                 EntityState.Deleted
                                               | EntityState.Modified
                                               | EntityState.Unchanged)
                                      where entry.EntityKey != null
                                      select entry.Entity);
 
     context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}

Bu kodu https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/ adresinden aldım [2].

Kaynaklar:

[1] http://www.entityframeworktutorial.net/EntityFramework4.3/persistence-in-entity-framework.aspx

[2] https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

6 Ekim 2010 Çarşamba

Hırsız

Bir gece Hoca'nın evine hırsız girer, evde ne var ne yok hepsini çalar, evine götürür. Bu sırada onu gözetleyen Hoca, eşyasının kalanlarını sırtına alarak hırsızın evine götürür. Hırsız hayretle sorar:
-"Evimde bu saatte ne arıyorsun?"
Hoca gayet sakin:
-"Oğlum, biz bu eve taşınmadık mı?"

Ciyaklatmadan

Çok soğuk bir kış günü padişah, tebdil-i kıyafet gezmeye karar vermiş. Yanına başvezirini alıp yola çıkmış. Bir dere kenarında çalışan yaşlı bir adam görmüşler. Adam elindeki derileri suya sokup döverek tabaklıyormuş. Padişah, ihtiyarı selamlamış:
– “Selamünaleyküm ey pir-i fani!”
– “Aleykümselam ey serdar-ı cihan!”
Padişah sormuş:
– “Altılarda ne yaptın?”
– “Altıya altı katmayınca, otuz ikiye yetmiyor!”
Padişah gene sormuş:
– “Geceleri kalkmadın mı?”
– “Kalktık… Lâkin, ellere yaradı!”
Padişah gülmüş:
– “Bir kaz göndersem yolar mısın?”
– “Hem de ciyaklatmadan!”
Padişahla başvezir adamın yanından ayrılıp yola koyulmuşlar. Padişah başvezire dönmüş:
– “Ne konuştuğumuzu anladın mı?”
– “Hayır padişahım.”
Padişah sinirlenmiş,
– “Bu akşama kadar ne konuştuğumuzu anlamazsan kelleni alırım!”
Korkuya kapılan başvezir, padişahı saraya bıraktıktan sonra telaşla dere kenarına dönmüş. Bakmış, adam hâlâ orada çalışıyor. Hemen sormuş:
– “Ne konuştunuz siz padişahla?”
Adam, başveziri şöyle bir süzmüş:
– “Kusura bakma, bedava söyleyemem. Ver bir yüz altın, söyleyeyim.”
Başvezir, yüz altın verip sormuş:
– “Sen padişahı, ‘serdar-ı cihan’ diye selamladın. Nereden anladın padişah olduğunu?”
– “Ben dericiyim. Onun sırtındaki kürkü padişahtan baskası giyemezdi.”
Vezir kafasını kaşımış.
– “Peki, ‘altılara altı katmayınca, otuz ikiye yetmiyor’ ne demek?”
Adam, bu soruya cevap vermek için de bir yüz altın almış.
– “Padişah, altı aylık yaz döneminde çalışmadın mı ki, kış günü çalışıyorsun, diye sordu. Ben de, yalnızca altı ay yaz değil, altı ay da kış çalışmazsak yemek bulamıyoruz dedim.”
Vezir bir soru daha sormuş:
– “ ‘Geceleri kalkmadın mı’ ne demek?”
Adam bir yüz altın daha almış:
– “Çocukların yok mu diye sordu. Var, ama hepsi kız. Evlendiler, başkasına yaradılar, dedim.”
Vezir gene kafasını sallamış.
– “Bir de kaz gönderirsem dedi, o ne demek?”
Adam gülmüş:
– “Onu da sen bul artık!..”

Balık mı Kuş mu?

Aşağıdaki ilk resimde bir adanın yanında bir tekne ve bir balık görünüyor. Resmi ters çevirince ise ağzında koyun taşıyan bir kuş görünüyor.



25 Aralık 2009 Cuma

Samsung Star Wi-Fi ve Windows Mobile 5.0

Windows Mobile 5.0 kurulu HTC Qtec 8500 Strtrk telefonumun bozulması ve tamirinden ümit kesilmesi üzerine Samsung Star Wi-Fi telefon aldım. Eskiden yeniye geçişte gördüğüm farklılıkları bir yazayım istedim.


Adres Defterinde Arama

Eski telefonumda adres defterinde arama çok kolaydı. Rehbere girip aramak istediğim kişinin adındaki veya soyadındaki harflerin tuşlarına bir defa basarak veya telefon numarasını ezbere biliyorsam numaranın herhangi bir yerindeki birkaç numarayı tuşlayarak kolayca aradığım kişiye ulaşabiliyordum. Mesela Nilüfer Turizm'e ulaşmak istediğimde T harfi için 8'e, U harfi için 8'e ve R harfi için 7'ye bastığımda turizm şirketleri dışındaki isimler filtrelenerek bütün turizm şirketleri görüntüleniyordu. Böylece Ankara'ya gitmek için Nilüfer Turizm'i seçmeye çalışırken Anka Turizm'in de bir alternatif olarak var olduğunu hatırlayabiliyordum.

Şimdiki telefonumda en çok aradığım özellik bu. Samsung Star Wi-Fi'da ismin ne şekilde kayıtlı olduğunu bilmem gerekiyor. Nilüfer Turizm için ya listeyi N harfine kadar kaydırmam ya da arama kutusuna ilk birkaç harfini yazıp aratmam gerekiyor.

Alarmlar

Önceki telefonumda alarmlar çok kötüydü. Sadece 1 tane alarm kurulabiliyordu. İkinci bir alarm kurabilmek için üçüncü parti bir yazılım kurdum makineme. Fakat 2 alarm da işimi görmüyordu. Sonra bu problemi Outlook ile senkronizasyon yaparak çözebileceğimi fark etmiştim. Bilgisayarda Outlook içerisine günlük randevu kurarak cep telefonumla senkronize ediyordum.

Önceki telefonun kötü bir özelliği de telefon kapalı olduğu zaman alarmların çalmıyor olmasıydı.

Şimdiki telefonumda ise 10 tane alarm kurabiliyorum. Bu bana fazlasıyla yetiyor. Ayrıca telefon kapalı da olsa alarmlar çalıyor.

Şifreli Notlar

Bankacılık şifrelerimin ayda bir veya 45 günde bir değişmesi gerektiği için bu uzun şifreleri ezberimde tutmam zorlaşıyordu. O yüzden bu şifreleri cep telefonumda tutmaya kara vermiştim. HTC'den önceki telefonumda bazı notlara erişim için şifre koymak mümkündü. HTC'de ise böyle bir özellik yoktu. Ben de kendim bunun için C# dilinde bir program yazıp telefonuma yüklemiştim. Program çalışınca şifre soruyordu ve böylece bütün notlara şifreyle ulaşılıyordu.

Şimdiki telefonumda ise telefonun bazı parçalarına erişim için şifre konulabiliyor. Mesela Notlar programcığına girilirken veya tarayıcı açılırken şifre istenmesi sağlanabiliyor.

Telefon Numaralarının SMS ile Gönderilmesi

Bir arkadaşım telefon edip "falanın telefon numarasını mesajlayabilir misin?" diye sorduğunda eski telefonumda bunu yapamıyordum. HTC, telefon numarasını sadece MMS ile gönderebiliyordu. Ben de kendim program yazıp SMS ile gönderme özelliğini eklemiştim.

Şimdiki telefonumda ise bu özellik gayet güzel bir şekilde mevcut.

İkinci Cep Telefonu

Bazı arkadaşlarımın iki tane hattı olduğu için bu numaraların ikisini de rehberimde tutmam gerekiyor. Eski telefonumun rehberinde ikinci cep telefonu için bir alan mevcut değildi. Ben de ikinci numarayı ya iş telefonu olarak, ya ikinci iş telefonu, ya da ikinci ev telefonu olarak kaydediyordum. Bu da tabii ki kafa karıştırıcı oluyordu.

Şimdiki telefonumda herkesin 5 telefon numarası tutulabiliyor (öncekinde daha fazlaydı). Fakat bu numaraların isterseniz hepsini cep telefonu olarak kaydedebiliyorsunuz. Ya da mesela ikisini cep, ikisini ev, birini iş telefonu olarak seçebiliyorsunuz.

Samsung'un rehberi daha sade ama HTC'ninkine göre bence daha kullanışlı.

Sonuç

Netice olarak yeni dokunmatik ekranlı telefonumdan oldukça memnunum. Eksikliklerini gidermek için beni program yazmak mecburiyetinde bırakmıyor :)

Not: Yeni telefonu aldıktan sonra eskisinin tamir edildiğini öğrendim. Sevinsem mi üzülsem mi bilemedim.

Bugünün İşini Yarına Bırakma

Az önce Outlook'a kurduğum "Çiçekleri sula" hatırlatması ekranda belirince "Bir daha hatırlatma" düğmesine basıp, çiçekleri sulamadan mail'lerime bakmak üzereydim ki, "Ne yapıyorum ben yahu?" dedim ve kalkıp çiçekleri suladım.


Bugünün işini yarına bırakmamak lazım. Madem ki hatırlatma kurulmuş, hatırlatma çaldığı anda o işi yapmak lazım. Sonraya bırakınca kalıyor.

Bu satırları yazarken cep telefonuma kurduğum bir hatırlatma çaldı. Okuldaki pilleri eve götürmeyi unutmamak için kurmuştum bunu. Aldığım dersin ve kararın etkisiyle hemen yazıyı yazmaya ara verip pilleri çantama attım.

İnsanın ara sıra böyle radikal kararlar alması gerekiyor.

3 Nisan 2009 Cuma

C#'ta ?? operatörü

C#'ta daha önce hiç karşılaşmadığım bir operatörle karşılaştım: "??" Daha da ilginci, bu operatörün ne olduğunu araştırınca bir de "?" operatörü ile karşılaştım. "?:" operatörünü biliyordum ama bu ikisini ilk defa görüyorum.


"??" operatörü, bir "binary operator", yani toplama, çıkarma operatörleri gibi sağına ve soluna operand olan bir operatör. Sol taraftaki operand null değilse onu döndürüyor, null ise sağdakini döndürüyor.

Mesela:

string s = null;
string y = s ?? "Undefined";

Bu örnekte s'nin değeri null olduğundan, y'nin değeri "Undefined" olacak. s, null olmayan bir string olsaydı, x'in değeri y'ye kopyalanacaktı.

Gelelim "?" olayına... Normalde bir string değişken null değeri alabilir ama bir int değişkenin değeri null olamaz. Ama siz değeri null olan bir int değişkeni tanımlamak istiyorsanız bu değişkeni int tipinde değil de int? tipinde tanımlayabiliyorsunuz.

Mesela:

int x = null;

yazdığınızda derleyici hata verir; çünkü int değişkene null değeri atanamaz. Ama,

int? x = null;

yazarsanız derleyici hata vermez. Bu tür null değeri alabilen tiplere "Nullable Types" deniyormuş.

"??" operatörü C# 2.0 versiyonundan itibaren kullanılabiliyormuş.

Peki böyle bir operatöre neden ihtiyaç duyulmuş?

Veritabanlarında alanların tipini belirleyebiliyoruz ama bu alanlara değer girilmezse oradaki değer null olarak tutuluyor. Veritabanından gelen değeri, null olamayan bir değişkene atamaya çalışırsanız çalışma zamanı hatası meydana geliyor. Bu yüzden veritabanından gelen verilerin null olup olmadığını kontrol etmek gerekiyor.

Bu problemin üstesinden gelmek için ben kodlarımı şöyle kullanıyordum:

string duyuru = (dbRow["Duyuru"].GetType() != typeof(DBNull)) ? (string)dbRow["Duyuru"] : string.Empty;

Buradaki dbRow, veritabanından gelen bir kaydı gösteriyor. Bu kayıttaki "Duyuru" alanını çekmek için dbRow["Duyuru"] kullanılıyor. Fakat bu ifade, geriye bir "object" sınıfından bir nesne döndürüyor. Dolayısıyla o satırdaki duyuru null ise, dbRow["Duyuru"] ifadesi geriye bir DBNull nesnesi döndürüyor. Bunu string'e çevirmeye çalıştığınızda da hata meydana geliyor. Bundan dolayı ifadenin tipinin DBNull olup olmadığı kontrol edilmeli. Eğer DBNull ise, duyuru string'ine boş bir string atanmalı.

?? operatörünü öğrendikten sonra yukarıdaki satırı şu şekilde yazmak mümkün olacak diye tahmin ediyorum (ama denemem lazım):

string duyuru = (string)dbRow["Duyuru"] ?? string.Empty;