5 Temmuz 2011 Salı

System.Data.Objects.DataClasses.EntityObject Hatası

Aslında pekde sık karşılaşılmayan bir sorundur.

"The type 'System.Data.Objects.DataClasses.EntityObject' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Data.Entity, Version=4.0.0.0, Culture=neutral"

Ancak bu hata ile ilk karşılaştığımda "bu ne abi?" şeklinde bir yaklaşımım oldu.

Aslında cevap çok basit imiş. Çalışmış olduğumuz web projesine System.Entity kütüphanesini eklememiz yeterli olacaktır.

Bu kadar basit.

Kolay gelsin sizlere.

Etiketler: , ,

30 Haziran 2011 Perşembe

Entity Framework ile Stored Procedure Kullanımı

Bu yazımda Stored Procedure yani saklı yordam ile Entitiy Framework nasıl çalışacak bunu anlatmaya çalışacağım.

Öncelikle Stored Procedure oluşturalım. Ben burada birden fazla tablodan kayıt çeken komplex bir yapı oluşturdum ki ara sınıf yaratılmasınıda burada görelim.

CREATE PROCEDURE DokumanArama
@DokumanTipi uniqueidentifier = null,
@Etiket nvarchar(300)=null,
@KullaniciGurubu int = null,
@Yayinda bit = null,
@AdSoyad nvarchar(250)=null,
@TarihBaslangic DateTime = null,
@TarihBitis DateTime = null
AS
SELECT Dokuman.*, DokumanTip.Ad, Yonetim.AdSoyad, Yonetim.KullaniciAdi, Yonetim.Sifre, Yonetim.EPosta, Yonetim.KayitTarihi, Yonetim.Aktif FROM Dokuman INNER JOIN DokumanTip ON Dokuman.DokumanTipiID = DokumanTip.ID INNER JOIN Yonetim ON Dokuman.EkleyenID = Yonetim.ID
WHERE
(Dokuman.DokumanTipiID = ISNULL(@DokumanTipi,DokumanTipiID)) OR
(Dokuman.ID = (SELECT EtiketDokuman.DokumanID FROM EtiketDokuman INNER JOIN Etiketler ON EtiketDokuman.EtiketID = Etiketler.ID WHERE (Etiketler.Etiket LIKE '%' + ISNULL(@Etiket, Etiketler.Etiket) + '%'))) OR
(Dokuman.KullaniciGurubu = ISNULL(@KullaniciGurubu, Dokuman.KullaniciGurubu)) OR
(Yonetim.AdSoyad LIKE '%'+ ISNULL (@AdSoyad,AdSoyad)+'%') OR
(Dokuman.Yayindami = ISNULL(@Yayinda, Dokuman.Yayindami)) OR
(Dokuman.EklenmeTarih BETWEEN ISNULL(@TarihBaslangic, Dokuman.EklenmeTarih) AND ISNULL(@TarihBitis, Dokuman.EklenmeTarih))


Yukarıda görüldüğü üzere stored prosedurum hem birden fazla değer alıp değeri null olanları koşul sorgumuza eklemiyor hemde birden fazla tablo ile çalışıp geriye birden fazla tablo değeri döndürüyor. Bunu bir dataset e aktarmak yerine bir genericlist e aktarmak istiyoruz.

Önce yaratığımız procedurü Entity Dosyamıza ekleyelim.
Sırası ile aşağıdaki resimleri takip edelim.

Öncelikle UpdateModelFromDataBase seçeneğini tıklayarak SP seçeceğimiz ekrana geçiyoruz.




Sonrasında SP ümüzü seçip Entity Data Modele ekliyoruz ki programın bu SP den haberi olsun.
Şu anda SP miz EDM (entity  data model) içerisine eklendi. Artık sistemin bu SP den haber var. Şimdi bunu tanımlayalım.
 Add seçeneği altından Funtion İmport diyerek SP mizi kullanıma dahil ediyoruz.

 Ve son olarakda SP mize özel bir isim veriyoruz. Eğer SP miz var olan Entity Class lardan birini kullanmakta ise seçeneklerden dönüş tipine (Return a Collection of) kullanacağı hazır EC lerden birini seçebiliriz. Ancak buraa olduğu gibi birden fazla tablo seçimi söz konusu ise hazır sınıflar işimize yaramaz ve bizim yeni bir tip türetmemiz gerekir. Burada da bu işlemi yapıyoruz.

Evet şimdi sıra geldi bu SP mizi c# da çağırmaya.
Yani yaratığımız sınıf olan "Dokuman_Arama_Result" bizim dönüş tipimiz olacaktır.

public List RetriveAllWithParameters(Guid? DokumanTipi, string Etiket, int? KullaniciGurubu, bool? Yayinda, string AdSoyad, DateTime? TarihBaslangic, DateTime? TarihBitis)
    {
        try
        {
            List List_Dokuman_Arama_Result = new List();
            using (BilgiBankasiEntities bbe = new BilgiBankasiEntities())
            {
                List_Dokuman_Arama_Result = bbe.Dokuman_Arama(DokumanTipi, Etiket, KullaniciGurubu, Yayinda,
                 AdSoyad, TarihBaslangic, TarihBitis).ToList();
            }
            return List_Dokuman_Arama_Result;
        }
        catch (Exception)
        {
            return null;
        }
    }


Yukarıda yazan fonksiyon ile SP mize erişebilir, geriye Generic tipinde bir list döndürüp nesne tabalı işlemlerde kullanabilriz
Bu yazımın burada sonuna geliyorum. Umarım açıklayıcı ve faydalı bir yazı olmuştur.

Etiketler: , ,

28 Haziran 2011 Salı

The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid. Hatası

Entity Framework kullanılırken yeni bir datamodel oluşturuyoruz. Ancak projemizi çalıştırınca
"The specified named connection is either not found in the configuration, not intended to be used with the EntityClient provider, or not valid." hatası alıyoruz.

Bunun sebebi arkadaşlar EF nin bağlantı cümlesini sadece bir yere yani app.config dosyasına eklemiş olmasıdır. Fakat VS malesef bağlanmak için web config doyasına bakmaktadır. Bu durumda bağlantı cümlemizi aşağıda görüldüğü gibi web config dosyamıza taşımamız halinde tüm sorun çözülecektir.
Bu kodları system.web düğümünün üstüne yerleştiriyoruz.

  <connectionStrings>
    <add name="BilgiBankasiEntities" connectionString="metadata=res://*/BilgiBankasi.csdl|res://*/BilgiBankasi.ssdl|res://*/BilgiBankasi.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=OMP_COMPUTER;Initial Catalog=BilgiBankasi;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

Etiketler: , ,