WCF Data Service ile Database Verisine Erişim

28 Oca

Bir önceki WCF Data service ile ilgili yazımızda herhangi bir veri kaynağına bağlı olmayan veri kolleksiyonlarına servisler aracılığıyla erişimi incelemiştik. Bu yazıda ise bir veri kaynağına bağlı olan EDMX modeldeki veri kümelerine WCF data servisleri aracılığıyla erişmeyi inceleyeceğiz.

İlk olarak WcfDatabaseDataservice adında yeni bir Web projesi eklenir. Projeye StoreModel adında yeni bir ADO.Net Entity Data Model eklenir.

Model üzerindeki veri kümelerine erişmek için projeye StoreService adında bir WCF data service eklenir.


   public class StoreService : DataService<StoreEntities>
   {
       public static void InitializeService(DataServiceConfiguration config)
       {
          config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
          config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
       }
   }

Servis tipinin  DataService<StoreEntities> generic tipinden türetildiği görülmektedir. Yani StoreEntities içindeki veri kümelerine erişilecek.

SolutionExplorer penceresindeki StoreService.svc dosyasına sağ tıklayıp “View in Browser” seçeneği ile servise web browser üzerinden erişebiliriz.

Servis aracılığıyla Collection düğümlerindeki veri kümelerine, kendine ait URI’ler yardımıyla erişilebilir. Örneğin kategorilere erişmek için http://localhost:10182/StoreService.svc/Categories kullanılabilir.

Model üzerindeki stored procedure kullanılmadan önce Function Import işleminden geçirilmelidir. Bunun için Model Browser penceresinden ilgili stored procedure ki örneğimizdeki store procedure adı GetProductSP’dir. Bu procedure sağ tıklayıp Add Function Import tıklanır ve açılan pencerede Get Column Information butonu tıklanarak kolon bilgileri listelenir. Ardından Create New Complex Type butonu ile GetProductBySP_Result kompleks tipi oluşturulur.

WCF data servisi üzerinden GetProductSP function import’una direk erişilemez. Ancak StoreService sınıfına bir metod ekleyerek, metod üzerinden erişim sağlayabiliriz. Servis sınıfına eklenen metodlar servis operasyonları(Service Operations) olarak adlandırılır. Servis operasyonları parametre alabilir. Fakat servis oprasyonlarının geri döndürdüğü değerler Ienumerable, Iqueryable veya void tipinde olmalıdır.

Servis operasyonları WebGet veya WebInvoke attribute ile imzalanmalıdır. WebGet attribute, HTTP GET ile çalışır, WebInvoke ise HTTP POST ile çalışır. Aşağıdaki örnek, WebGet attribute ile imzalanmış bir servis operasyonunun URI yardımıyla nasıl çalıştırıldığını göstermektedir.

public class StoreService : DataService<StoreEntities>
{
        public static void InitializeService(DataServiceConfiguration config)
        {
           config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
           config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
           config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }

        [WebGet]
        public IQueryable<GetProductBySP_Result> ProductsBySp()
        {
           using (StoreEntities context = new StoreEntities())
           {
              return context.GetProductBySP().ToList().AsQueryable();
           }
        }
    }

Servis ayarlamalarının yapıldığı DataServiceConfiguration sınıfının servis operasyonlarının yetkilerini belirlediği bir metod vardır. Bu metod setServiceOperationAccessRule metodudur.

Metodu browser üzerinden http://localhost:10182/StoreService.svc/ProductBySp şeklinde çağırılır.

Sonuç olarak servis aracılığı ile modeldeki bir “stored procedure” erişimini incelemiş olduk.

Umarım faydalı bir yazı olmuştur.