Asp.Net MVC – Foreign key & Combobox yapımı

17 Mar

Merhaba arkadaşlar,
Bugün sizlere MVC ile model üzerinden nasıl foreign key yapacağımızı ve bunu html sayfamızda açılır menü yani combobox şeklinde göstereceğimizi anlatmaya çalışacağım.

Öncelikle Foreign key‘i kısaca bir örnek ile özetlemek istiyorum.
Foreign key, bir tablonun alanı ile diğer tablonun primary key alanı arasında ilişki kurulmasıdır.
Örnek vermek gerekirse; “ogrenci” adında tablonuz olduğunu ve bu tabloda DersId adında bir alanınız olduğunu düşünün. Birde “dersler” adında tablonuzun olduğunu ve bu tabloda sadece derslerin tutulduğunu düşünelim.

Biz hangi öğrencinin hangi dersi aldığını bilmek için, dersId ile dersler tablosunun Id‘sini ilişkilendiririz. İşte bu işleme foreing key diyoruz.

Şimdi bu işlemi MVC’de nasıl yapıyoruz kısmına geçelim.
Örnek senaryo üzerinden gideceğim. CostDetails ve CostType adında 2 adet model classlarımız olsun.

*CostDetail = Masraf tablom
*CostType = Masraf tipleri tablom

public class CostDetail
    {
        [Required]
        public int Id { get; set; }

        [Required]
        [DisplayName("User")]
        public string User { get; set; }

        [Required]
        [Column(TypeName = "date")]
        [DisplayName("Date")]
        public DateTime TransDate { get; set; }

        [Required]
        [DisplayName("CostType")]
        public int CostTypeId { get; set; }

        [StringLength(700)]
        [DataType(DataType.MultilineText)]
        [DisplayName("Project description")]
        public string Description { get; set; }

        [DisplayName("TaxNum")]
        public TaxNum TaxNum { get; set; }

        [Required]
        [DisplayName("Amount")]
        public double Amount { get; set; }
    }
public class CostType
    {
        [Key]
        [Required]
        public int Id { get; set; }

        [Required]
        [DisplayName("Name")]
        public string name { get; set; }

        [DisplayName("Description")]
        public string desc { get; set; }
    }

Şuanda 2 tablo arasında bir ilişki yok.
İlişki kurmadan önce, Amacım: CostDetails.CostTypeId alanı ile CostType.Id alanlarını ilişkilendirmek ve daha sonra CostDetails.CostTypeId alanında costType tablosunda ki verileri combobox‘ta göstermek.

Şimdi ilişki kuracağım kodlarıda ekleyerek model classlarımızı aşağıda ki gibi düzenleyelim.

public class CostDetail
    {
        [Required]
        public int Id { get; set; }

        [Required]
        [DisplayName("User")]
        public string User { get; set; }

        [Required]
        [Column(TypeName = "date")]
        [DisplayName("Date")]
        public DateTime TransDate { get; set; }

        [Required]
        [DisplayName("CostType")]
        public int CostTypeId { get; set; }

        [StringLength(700)]
        [DataType(DataType.MultilineText)]
        [DisplayName("Project description")]
        public string Description { get; set; }

        [DisplayName("TaxNum")]
        public TaxNum TaxNum { get; set; }

        [Required]
        [DisplayName("Amount")]
        public double Amount { get; set; }
        //Yeni eklediğim kod;
        public virtual CostType CostType { get; set; }
    }

public class CostType
    {
        [Key]
        [Required]
        public int Id { get; set; }

        [Required]
        [DisplayName("Name")]
        public string name { get; set; }

        [DisplayName("Description")]
        public string desc { get; set; }
        //Yeni eklediğim kod
        public virtual ICollection<CostDetail> CostDetails { get; set; }
    }

Evet arkadaşlar şuanda 2 tablo arasında ki ilişkimiz kuruldu. Artık bu modeli tetikleyip, SQL‘de nasıl gözüktüğünü gerçekten ilişki olup olmadığını kontrol edebiliriz.

Gördüğünüz gibi foreign key oluşmuş.

Burada akıllara ilişkiyi nasıl yakalıyıpta otomatik oluşturuyor soruları gelebilir;
MVC, Özel isimlendirmeleri ile bu işlemleri yapıyor. Mesala bir modelde “Id” baş harfi büyük şekilde yazarsanız bunu otomatik olarak algılıyor ve bu alanı Primary key olarak işaretliyor.

Aynı şekilde, foreign keyler için biz CostTypeId olarak belirttik ve alt tarafda virtual olarak gidip CostType tablosuna bakmasını işaret ettik > CostType tablosunda ise ICollection yani liste tipinde CostDetails tipinde veri olduğunu işaret ettik. Burada ki özel isimlendirmeler sayesinde bu alanları foreign key yapacağını anlayıp otomatik olarak foreign key yapmış oldu.

Bu alanı View’da combobox şeklinde göstermek için ise

Göstereceğimiz viewın ilgili controllerına bu veriyi liste şeklinde göndermeliyiz;

 public ActionResult Create()
        {
            ViewBag.CostTypeId = new SelectList(db.CostType, "Id", "name", 1);
            return View();
        }

Daha sonra ilgili view’da;

<div class="form-group">
            @Html.Label("GiderTuru", "Gider türü", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("CostTypeId", null, String.Empty, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessageFor(model => model.CostType, "", new { @class = "text-danger" })
            </div>
        </div>

İşlem sonucu ekran görüntüsü;

Evet arkadaşlar işlemler bu kadardır. Sonra ki yazılarımda görüşmek üzere…

Teşekkürler.

Bir Cevap Yazın