Entity Framework - Many To Many Relations - Link Tablosunu Okumak

Merhaba Arkadaşlar,

Hatırlayacağınız üzere bir önceki yazımızda veritabanı tarafındaki Many-To-Many Relation' ların, Entity Framework tarafında nasıl değerlendirilebileceğine değinmeye çalışmıştık. Dikkat edilmesi gereken önemli noktalardan birisi, veritabanı tarafında yer alan ara bağlantı tablosunun Entity Framework üzerindeki modele alınmayışıydı. Ancak tam bu noktada ortaya bir soru işareti çıkmakta. Ya çalışma zamanında sadece ilişkili primary key alanlarının değerlerini elde etmek istersek. Bir önceki senaryomuza göre bu, hangi Track satırının hangi Playlist' ler ile ve hangi Playlist satırının hangi Track' ler ile ilişkili olduğunun görülmesi anlamına gelmektedir. Kısacası sadece TrackId ve PlaylistId değerlerinin eşleşmesine bakmak istediğimizi düşünebiliriz. Bu durumda aşağıdaki gibi bir kod parçası işimizi görecektir. Şükürler olsun isimsiz tiplere(Anonymous Type)Wink 

using System;
using System.Linq;

namespace ManyToMany
{
    class Program
    {
        static void Main(string[] args)
        {
            using (ChinookEntities entities = new ChinookEntities())
            {
                #region Only Related Columns

                var relations = from t in entities.Tracks
                                from p in entities.Playlists
                                where t.Name.StartsWith("Ab")
                                select new
                                {
                                    t.TrackId,p.PlaylistId
                                };

                foreach (var relation in relations)
                {
                    Console.WriteLine(relation.ToString());
                }

                #endregion
            }
        }
    }
}

Bu LINQ sorgusunda çoklu Select işlemi yapılmaktadır. Sorguya göre Track.Name değeri Ab ile başlayan parçaların TrackId değeleri ile Playlist Entity nesnesi içeriğinde yer alan PlaylistId değerleri arasındaki ilişkiler, yeni bir isimsiz tip(Anonymous Type) içerisine dahil edilmektedir. Kodun çalışması sonucu aşağıdakine benzer bir çalışma zamanı çıktısı elde edilecektir.

Arka planda çalışan SQL Sorgusu ise aşağıdaki gibidir.

SELECT 
[Extent1].[TrackId] AS [TrackId], 
[Extent2].[PlaylistId] AS [PlaylistId]
FROM  [dbo].[Track] AS [Extent1]
CROSS JOIN [dbo].[Playlist] AS [Extent2]
WHERE [Extent1].[Name] LIKE N'Ab%'

Görüldüğü üzere Anonymous Type kullanımı nedeniyle sadece istediğimiz TrackId ve PlaylistId alanları Select sorgusuna dahil edilmiştir. Buda arka planda çalışan SQL sorgusunda, tüm tablo alanlarının hesaba katılmaması anlamına gelmektedir ki bizim için bir avantajdır ve istediğimizde zaten budur Wink Bir nevi veritabanında yer alan ama Entity olarak kod tarafına aktarılmayan ara tablo içeriğini, LINQ tarafında elde etmiş olduk. Entity Framework tarafında ipucu tadındaki başka konularlar devam ediyor olacağız. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

Yorumlar (1) -

  • Teşekkürler hocam. Bir ekleme yapmak isyiyorum. Ara bağlantı tablosunda foreign keyler dışında bir property yer aldığında EDM yaratılırken ara tablo modele ekleniyor. Fakat şöyle bir sorunla karşılaştım. Chinook veritabındaki PlaylistTrack tablosuna itemdate property sini ekledim. Modeli update etmeyi denedim fakat ara tablo modele eklenmedi. Yeni model yarattığımda ise ara tablo EDM içine eklendi.

Yorum ekle

Loading