Wcf servisinde first code veya datamodel kullanırken oluşan hata

84 views
Skip to first unread message

Eyüp ALBAYRAK

unread,
May 17, 2012, 12:54:08 PM5/17/12
to altdotnetturkiye
Herkese merhabalar,

Şöyle bir problemimiz var. Codefirst ile oluşturulmuş sınıflarımız var
ve bunlar birinden türemiş sınıflar ve aralarında ilişki olan
sınıflar. Örneğin Kisi sınıfı ve Ogrenci sınıfı var aralarında bire
çok ilişki var. Bu code first sınıfları tanımlandı DB oluşturuldu.
Başka bir projeye referans olarak ekldiğimizde crud işlemlerini
yapabiliyoruz. Fakat wcf web servisi ile dataları çekmeye
çalıştığımızda "CommunicationException: The underlying connection was
closed: The connection closed unexpectedly." hatası ile
karşılaşıyoruz. Lazyloading i false yaptık öylede denedik. Aşağıdaki
sorguda Adres verisi üzerinden kişi nesnesine de erişmemiz lazım ancak
berlittiğim hatayı alıyorum. Wcf servisleri ile codefirst veya entity
modellerle çalışmış arkadaşların yardımlarını bekliyorum . Teşekkürler



Örnek sorgu:

public List<Adres> getirAdres()
{

using (OgrenciDbContext context = new OgrenciDbContext())
{

return context.Adres.ToList<Adres>();
}
}

Tuna Toksoz

unread,
May 17, 2012, 12:55:29 PM5/17/12
to altdotne...@googlegroups.com
ORM ile iliskilendirilmis nesneleri WCF ten gecirmek iyi bir pratik degil. onun icin farkli siniflar yapip onlara map etmeniz dha saglikli.

Tuna Toksöz
Eternal sunshine of the open source mind.



2012/5/17 Eyüp ALBAYRAK <eypal...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "altdotnetturkiye" group.
To post to this group, send email to altdotne...@googlegroups.com.
To unsubscribe from this group, send email to altdotnetturki...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/altdotnetturkiye?hl=en.


Eyüp ALBAYRAK

unread,
May 17, 2012, 2:23:39 PM5/17/12
to altdotnetturkiye
ORM nesneleri ile çalışmak istememizdeki amaç daha hızlı uygulama
geliştirmek istememiz. Madem pratik iyi değil ileride daha büyük
sıkıntılara neden olacak yöntemimizi değiştirmeyi düşünelim. Bu konuda
fikir verebilirmisin peki nasıl bir proje yapısı kuralım . ORM
nesnelerimiz nerede olsun bunlarla kendi yazacağımız sınıfları nasıl
konuşturmamız map etmemiz lazım. Ayrıca crud işlemlerinde şöyle bir
yapı iyi değilmiş gibi geliyor KisiKaydet(strin ad,strin soyad,string
tc..................) değilde KisiKaydet(Kisi kisi) gelen kisi
nesnesini add deyip hızlı şekilde inset yapmak istiyorum diğer crud
işlemlerinide aynı şekilde kullanmak istiyorum. Örnek projeler ve
pratikler varsa incelemek isterim.

Gökhan Artuk

unread,
May 17, 2012, 2:39:34 PM5/17/12
to altdotne...@googlegroups.com
Kolay gelsin eyüp! Esaında burada yaşadığın problem bir çok şey olabilir. Bu hatanın sebebi datanın çokluğundan olabilir. Db tarafında bir hatadan kaynaklanabilir.

Öncelikle wcf tarafında config dosyana aşağıdaki kodu eklemeni öneririm.

<system.diagnostics>
 <!-- This logging is great when WCF does not work. -->
 <sources>
  <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
   <listeners>
    <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "c:\traces.svclog" />
   </listeners>
  </source>
 </sources>
</system.diagnostics>

Bu kod ile c: içerisinde traces.svclog diye bi dosya  oluşturur. Buda sana hata ile ilgili olarak stack trace ve daha fazla bilgi edinmeni sağlar. Zaten dosyaya çift tıkladığında Microsoft Service Trace Viewer programında açılır ve detayları daha iyi incelersin.

İkinci kısımda yani code first dahi yazılmış olsa db sınıflarını açmak yerine ikinci bir DTO katmanı oluşturman daha sağlıklı olacaktır. Ben şu anda gerçekleştirmeye devam ettiğim projemde Nhibernate, WCF, MVC olarak devam ediyorum.

Proje yapım ise service tarafında aşağıdaki gibi bir yapı kullanıyorum. Burada Project prefixi örnektir. Sende mesela bu Student v.b gibi bişeydir.

Project.Data  (Infrastructure, Repository, UnitOfWork, Session implementasyonları)
Project.Data.Test (Kimi zaman ihtiyaç doğrultusunda Data tarafında test amaçlı eklenen test projesi)
Project.Model (Code first db modelim)
Project.Service (WCF Servis, IOC, Castle WcfFacility)
Project.Service.Integration (WCF servis kodları, DTO modelleri)
Project.Service.Integration.Test (Servis tet yapısı)

Yukarıdaki yapı biraz farklı gelecek olursa sen bir IOC implementasyonu yapmadan kullanım gerçekleştiriyorsan bile DTO sınıflarını oluşturmanı wcf tarafından UI tarafına veri gönderirken ya da ya da UI tarafından Wcf tarafına CRUD işlemleri için veri alırken bu DTO sınıflarını kullanmanı ısrarla öneririm. Burada tabii ki biraz ekstra kod söz konusu olacaktır. Ancak daha solid bir yapı ortaya çıkacaktır diye düşünüyorum.

Kolaylıklar diliyorum..



17 Mayıs 2012 21:23 tarihinde Eyüp ALBAYRAK <eypal...@gmail.com> yazdı:
--
You received this message because you are subscribed to the Google Groups "altdotnetturkiye" group.
To post to this group, send email to altdotne...@googlegroups.com.
To unsubscribe from this group, send email to altdotnetturki...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/altdotnetturkiye?hl=en.




--
Web Application Developer
Gökhan ARTUK


Eyup Albayrak

unread,
May 17, 2012, 3:59:19 PM5/17/12
to altdotne...@googlegroups.com
Gökhan teşekkürler çok faydalı oldu. Konu ile ilgili araştırmalarımı testlerimi yapayım takıldığım yerde tekrar rahatsız ederim . :)

Hakan Taşpınar

unread,
May 18, 2012, 3:22:14 AM5/18/12
to altdotne...@googlegroups.com
@Tuna  DTO nesneleri mi kast ediyorsun. Rica etsem pratikliği  açabilir misin

17 Mayıs 2012 19:55 tarihinde Tuna Toksoz <teh...@gmail.com> yazdı:

Serdar KARAÇAY

unread,
May 18, 2012, 3:26:42 AM5/18/12
to altdotne...@googlegroups.com
DTO nesneleri dediğiniz nedir.
Repository Pattern de bunlar nasıl kullanılıyor mesela.


www.serdarkaracay.com | 0531 775 1659 | msn csha...@yahoo.com



18 Mayıs 2012 10:22 tarihinde Hakan Taşpınar <hknt...@gmail.com> yazdı:

Berke Sokhan

unread,
May 18, 2012, 3:36:07 AM5/18/12
to altdotne...@googlegroups.com

Uğur Tılıkoğlu

unread,
May 18, 2012, 3:48:09 AM5/18/12
to altdotne...@googlegroups.com
Eyüp Bey merhaba,

Eğer CRUD amaçlı ekranlar geliştiriyorsanız, EF contexti uzakta olacağı için state yönetimine de ihtiyacınız olacaktır. Bu servisler sadece CRUD amaçlı ekranlarınıza hizmet edecek ise; EF self tracking entity template'ine bir göz atmanızı tavsiye ederim. Model First ya da Database First çalışıyor iseniz, bu template sizi state yönetiminden kurtarıyor olacaktır.

Getireceği dezavantajlar ise;

- bu servisler sadece .NET spesifik olacak ve diğer platformlardan erişemeyeceksiniz
- lazy loading kullanamayacaksınız, eager loading kullanmalısınız.
- entityleriniz üzerinde state yönetimi ve serialization ile ilgili bir sürü kod gelecek, poco templateinin ürettiği ya da code first'te yazdığınız kodlar gibi temiz olmayacak.


illa mevcut yazdığım yöntemle devam edeceğim diyorsanız da, entity'lerinizin serialize olup olmadığını kontrol etmenizde fayda var.

selamlar

uğur

2012/5/18 Berke Sokhan <berke...@gmail.com>

oguzh4n

unread,
May 18, 2012, 10:38:19 AM5/18/12
to altdotnetturkiye
ProxyCreation ı kapatırsan sorun çözülür ama ChangeTracking yapamazsın

On May 18, 10:48 am, Uğur Tılıkoğlu <tiliko...@gmail.com> wrote:
> Eyüp Bey merhaba,
>
> Eğer CRUD amaçlı ekranlar geliştiriyorsanız, EF contexti uzakta olacağı
> için state yönetimine de ihtiyacınız olacaktır. Bu servisler sadece CRUD
> amaçlı ekranlarınıza hizmet edecek ise; EF self tracking entity
> template'ine bir göz atmanızı tavsiye ederim. Model First ya da Database
> First çalışıyor iseniz, bu template sizi state yönetiminden kurtarıyor
> olacaktır.
>
> Getireceği dezavantajlar ise;
>
> - bu servisler sadece .NET spesifik olacak ve diğer platformlardan
> erişemeyeceksiniz
> - lazy loading kullanamayacaksınız, eager loading kullanmalısınız.
> - entityleriniz üzerinde state yönetimi ve serialization ile ilgili bir
> sürü kod gelecek, poco templateinin ürettiği ya da code first'te yazdığınız
> kodlar gibi temiz olmayacak.
>
> illa mevcut yazdığım yöntemle devam edeceğim diyorsanız da,
> entity'lerinizin serialize olup olmadığını kontrol etmenizde fayda var.
>
> selamlar
>
> uğur
>
> 2012/5/18 Berke Sokhan <berkesok...@gmail.com>
>
>
>
>
>
>
>
> >http://martinfowler.com/eaaCatalog/dataTransferObject.html
>
> > 18 Mayıs 2012 10:26 tarihinde Serdar KARAÇAY <csharp...@gmail.com> yazdı:
>
> > DTO nesneleri dediğiniz nedir.
> >> Repository Pattern de bunlar nasıl kullanılıyor mesela.
>
> >>www.serdarkaracay.com| 0531 775 1659 | msn csharp...@yahoo.com
>
> >> 18 Mayıs 2012 10:22 tarihinde Hakan Taşpınar <hknts...@gmail.com> yazdı:
>
> >> @Tuna  DTO nesneleri mi kast ediyorsun. Rica etsem pratikliği  açabilir
> >>> misin
>
> >>> 17 Mayıs 2012 19:55 tarihinde Tuna Toksoz <tehl...@gmail.com> yazdı:
>
> >>> ORM ile iliskilendirilmis nesneleri WCF ten gecirmek iyi bir pratik
> >>>> degil. onun icin farkli siniflar yapip onlara map etmeniz dha saglikli.
>
> >>>> Tuna Toksöz
> >>>> Eternal sunshine of the open source mind.
>
> >>>> 2012/5/17 Eyüp ALBAYRAK <eypalbay...@gmail.com>
Reply all
Reply to author
Forward
0 new messages