30 Eylül 2015 Çarşamba

entity framework code first - birden fazla foreign key aynı tabloda ise

public class Team
{
    public int TeamId { get; set;} 
    public string Name { get; set; }

    public virtual ICollection<Match> HomeMatches { get; set; }
    public virtual ICollection<Match> AwayMatches { get; set; }
}

public class Match
{
    public int MatchId { get; set; }

    public int HomeTeamId { get; set; }
    public int GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}


public class Context : DbContext
{
    ...

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Match>()
                    .HasRequired(m => m.HomeTeam)
                    .WithMany(t => t.HomeMatches)
                    .HasForeignKey(m => m.HomeTeamId)
                    .WillCascadeOnDelete(false);

        modelBuilder.Entity<Match>()
                    .HasRequired(m => m.GuestTeam)
                    .WithMany(t => t.AwayMatches)
                    .HasForeignKey(m => m.GuestTeamId)
                    .WillCascadeOnDelete(false);
    }
}

28 Eylül 2015 Pazartesi

JsonRequestBehavior.AllowGet

JsonRequestBehavior.AllowGet parametresi, parametre gönderimi iznini açar. Yoksa geriye nesne döndüremezsin

2 Eylül 2015 Çarşamba

.Net Framework’te Timer Class’ları Arasındaki Farklar

 .Net Framework’te Timer ismine sahip tam 3 tane class var;
  • System.Timers.Timer
  • System.Threading.Timer
  • System.Windows.Forms.Timer
System.Timers.Timer
Özellikle Multi-Threaded uygulamalarda tercih edilir. Thread-safe olduğu için, birden çok thread’den erişilebilir.

System.Timers.Timer t = new System.Timers.Timer(5000);

t.Elapsed += delegate(object _s, System.Timers.ElapsedEventArgs _e)

{

    MessageBox.Show("5 saniye geçti!..");

    t.Stop();

};

t.Start();
System.Threading.Timer
TimerCallBack delegate kullanarak, atanmış metodu çalıştırabilir. Metod, framework tarafından oluşturulan başka bir thread’de çalışır.
Timer nesnesi oluşturulduğu anda, çalışmaya başlar ve scope’tan çıkana kadar da çalışır. Durdurmak veya Başlatmak mümkün değildir.
Aşağıdaki örnekte 2.parametre (null), Callback method’a aktarılacak parametreyi gösterir.
3.parametre (1000), Timer nesnesi başlatılmadan önce beklenecek süreyi gösterir.

System.Threading.Timer t = new System.Threading.Timer(new System.Threading.TimerCallback(TimerTest), null, 1000, 5000);

private void TimerTest(object state)

{

    MessageBox.Show("5 saniye geçti!..");

}
System.Windows.Forms.Timer
Toolbox’ta gördüğümüz nesnedir. Windows Form ile aynı thread’de ve senkron olarak çalışır, böylece hiçbir UI operasyonunu bölmez.

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();

t.Interval = 5000;

t.Start();

t.Tick += delegate(object _s, EventArgs _e)

{

    MessageBox.Show("5 saniye geçti!..");

    t.Stop();

};
Daha ayrıntılı bilgi için MSDN’deki şu makaleyi okuyabilirsiniz.

C# Delegate Kullanımı

delHer ne kadar bazı programlama dilleri(Java) tarafından Delegate kullanımının nesne yönelimli programlama paradigmasına aykırı olduğu savunulsada, C# tarafından sahiplenilmekte ve kullanılmaktadır. 
Peki delegate nedir ve neden kullanılır?
Delegate en basit anlamıyla metod referansıdır. Yani delegate metod referansını tutar.
Delegate tanımlanırken metodun geri dönüş değeri ve parametreleri belirlenir. Geri dönüş değerini void ve parametresiz tanımlamak da mümkündür. Kullanılacak metod, tanımlanmış olan delegate geri dönüş ve parametrelerine uygun olmalıdır.
Delegenin(delegate) başvurduğu bir metodu dinamik olarak değiştirebiliriz. Dolayısıyla bir delegeyi çağıran kod her çalıştığında farklı bir metod çalıştırabilir.

Delegate kullanılması metodları daha rahat kontrol etmemizi sağlayacak ve uygulamamızın performansını artıracaktır.
Bir örnek yapalım, markette satın alınan ürünler için fiş çıkaracaksınız. Satın alınan ürünün kaç tane olduğunu biliyorsunuz. Bu ürünler için hem KDV dahil hem de KDV hariç fiyatlarını göstereceksiniz. Bunun için iki ayrı metod tanımlayabilir ve bunları delegate yardımıyla kullanabilirsiniz. Örneğimizin kodları ve açıklamaları aşağıdaki gibi.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//Hesaplama adında bir delegate tanımı yapıldı.
//int tipinde bir parametre bekliyor
public delegate decimal Hesaplama(int adet); 
static void Main(string[] args)
{
  Hesaplama del = Fiyat;
  Console.WriteLine("KDV Hariç 5 Ürün"+
  " Fiyatı: {0}", del(5));
  del = KDVFiyat;  //delegate değiştiriliyor
  Console.WriteLine("KDV Dahil 5 Ürün"+
  " Fiyatı: {0}", del(5));
  Console.ReadLine();
}
 
static decimal Fiyat(int sayi)
{
  //Fiyat 10.5 kabul edilerek hesaplandı. (KDV Hariç)
  return sayi * 10.5m;   
}
 
static decimal KDVFiyat(int sayi)
{
  decimal kdvharicfiyat = sayi * 10.5m;
  //KDV %18 düşünüldü
  return kdvharicfiyat + kdvharicfiyat * 0.18m;
}

Aynı işlemi yapacağımız farklı bir kod yazımı daha yapalım. Burada delegate kullanımının daha etkili bir yöntemini göreceksiniz.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public delegate decimal Hesaplama(int adet); 
static void Main(string[] args)
{
         //istediğimiz sayıda ürün gönderebiliriz
         //Delegate tip, fonksiyon değişkenmiş gibi gönderilir
         Console.WriteLine(SonucHesapla(5, Fiyat));
         Console.WriteLine(SonucHesapla(5, KDVFiyat));
         Console.Read();
}
 
public static decimal SonucHesapla(int sayi, Hesaplama hesapla)
{
       return hesapla(sayi);
}
 
static decimal Fiyat(int sayi)
{
       //Fiyat 10.5 kabul edilerek hesaplandı. (KDV Hariç)
       return sayi * 10.5m;
}
 
static decimal KDVFiyat(int sayi)
{
       decimal kdvharicfiyat = sayi * 10.5m;
       //KDV %18 düşünüldü
       return kdvharicfiyat + kdvharicfiyat * 0.18m;
}

.net 6 mapget kullanımı

 app.UseEndpoints(endpoints => {     endpoints.MapGet("/", async context =>     {         var response = JsonConvert.Seriali...