# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > Silverlight >  سوال:نحوه فراخوانی storeprocedure در wcf ria service

## ma3566

با سلام.
 چه طور چند spکه عملیات update را روی یک جدول انجام میدهند  در domain service class را فراخوانی کنیم؟
 مثلا با زدن دکمه های مختلف در اینترفیس هر کدام از sp ها صدا زده شود.

----------


## mahdi7s

سلام

1)ابتدا می بایست آن پروسیجر را به صورت تابع به Entity Model تان معرفی کنید:
به قسمت طراحی Entity تان بروید(بر روی فایل edmx در پروژه وب دوبار کلیک کنید) سپس در تب باز شده راست کلیک و Add->Function Import را بزنید و در پنجره باز شده پروسیجرتان را انتخاب و یک نام برای تابع Entity اش انتخاب کنید.

2)به Domain Service مربوطه بروید و متدی با هر نامی (ترجیحا نام پروسیجرتان ایجاد کنید) و ... در داخل آن متد با کدی شبیه کد زیر می توانید آن را اجرا کنید:
this.ObjectContext.MyProcedure(...);

3)حالا می توانید در کلاینت آن متد را صدا بزنید...

موفق باشید

----------


## ma3566

من sp ها را فراخوانی کردم همه اجرا میشه ولی spهای از نوع selectکه در sql درست اجرا میدهد اینجا فقط یک رکورد بر می گردونه. نوع متد IQueryable تعریف کردم.و Ilist هم تعریف میکنم همین مشکل را دارد.راه حل چیه؟

----------


## mahdi7s

این مشکل از Entity Framework نیست و از سرویس ها هم نیست به احتمال زیاد یا جوابی که select شما می خواهد یکی بیشتر نیست و یا در متدی که برای پروسیجرتان تعریف کردید کدی باعث این خطا شده...

اگر همچنان مشکل را دارید بهتر از کد sql پروسیجرتان را به همراه متدی که در Domain Service تان تعریف کردید را بگذارید...

----------


## ma3566

ولی spرا در محیط sql ا جرا میکن درست جواب میدهد و چند رکورد برمیگرداند.اگر نوع متد را iqueryableتعریف کنم در اجرا این پیغام را می دهد.
the result of a query cannot be enumerated more than once.
و اگر از نوع ILISTتعریف کنم به ازای تمام رکورد هایی که sp در sqlبرمیگرداند اینجا رکورد اول تکرار میشود.(یعنی به ازای مثلا 5رکورد متفاوت 5بار رکورد اول را تکرار می کند).
من در sp یک select نوشتم که یک فانکشن به ازای هر رکورد فراخوانی میکند و چند فیلد دیگر از یک جدول-
و یک complex type هم براش تعریف کردم.
سوال:آیا همه ی فیلد هایی که spبرمیگرداند را باید درفایل metedata typeتعریف کنم یا فقط اعلام یک فیلد به عنوان کلید اصلی کافیست؟
با تشکر.

----------


## ma3566

سوال:فیلد هایی که با عنوان Navigation propertiesدر انتهای جدول ها در مدل اضافه میشود،برای چیه؟
 آیا میشه این فیلد ها را حذف کرد؟

----------


## mahdi7s

سلام

ابتدا جواب سوال هاتون ->




> آیا همه ی فیلد هایی که sp برمیگرداند را باید درفایل metedata type تعریف کنم یا فقط اعلام یک فیلد به عنوان کلید اصلی کافیست؟


اگر پروسیجرتان به جز entity های تولید شده بر می گرداند- باید یک metadata تعریف کنید در غیر اینصورت به خطا برخورد می کنید و WCF نمی تواند ComplexType شما را سریالی کند
و تنها تعریف اون Metadata به WCF این را می فهماند و این که یک نوع دیتابیسی کلید داشته باشد یک باید است.




> فیلد هایی که با عنوان Navigation propertiesدر انتهای جدول ها در مدل اضافه میشود،برای چیه؟
>  آیا میشه این فیلد ها را حذف کرد؟


این خصیصه ها چیزی جز دستور select برای واکشی جدوال مرتبط به هم نیستندو معمولا کار ما را ساده تر می کنند...
من تا به حال حذفشان نکردم ولی در هر Update دوباره اضافه میشن و حذفشان مشکلاتی پیش خواهد آورد ولی سعی کنید ازشان استفاده کنید




> ولی spرا در محیط sql ا جرا میکن درست جواب میدهد و چند رکورد برمیگرداند...


چگونه مقادیر واکشی شده را در متدتان بر می گردانید؟

----------


## ma3566

سلام .
 با تشکر از جواب و لطفتون.
میشه توضیح بدهید که چطور از navigation propertise ها استفاده کرد؟
من برای واکشی اطلاعات از بانک فقط spهایی راکه نوشتم فراخوانی میکنم و از متد های سرویس استفاده نمیکنم چون این متد ها همه ی فیلد های جدول و navigation propertiseها را هم برمیگرداند.وفیلد ها قابل فیلتر نیست.آیا راه حلی وجود دارد؟
--
اگر فید هایی را از یک جدول حذف کنیم و model را update کنیم این فیلد ها حذف نمیشه و همچنین datasourse هم update نمیشه،چیکار باید کرد؟
--
من sp را اجرا کردم و در datagrid نمایش دادم بعد با damaindatasourse هم این کار را کردم،ولی بعد برای صفحه بندی اطلاعات یکdatapagerهم بایند کردم و pagesizeهم برای هر دو تعریف کردم ومتد را با true کردن loadاجرا کردم ولی همان خطایی را که گفتم داد.برای صفحه بندی اطلاعات متد را باید چطور فراخوانی کرد؟

----------


## mahdi7s

سلام




> میشه توضیح بدهید که چطور از navigation propertise ها استفاده کرد؟


مثلا اگر بین دو جدول TableOne و TableTwo به ترتیب رابطه یک به چند وجود داشته باشد در Entity ایجاد شده برای جدول TableOne شما یک Navigation Property با نام TableTwo*s* دارید که بوسیله این خصیصه شما می تونید تمام TableTwo های مرتبط به رکورد فعلی جدول TableOne را حدف/آپدیت/واکشی/اضافه (با/بدون شرط) کنید. 

مثلا کد زیر اولین رکورد از TableTwo های مرتبط با اولین رکورد از جدول TableOne را بر می گردونه:
var tableTwo = this.ObjectContext.TableOnes.FirstOrDefault().Tabl  eTwos.FirstOrDefault();




> من برای واکشی اطلاعات از بانک فقط spهایی راکه نوشتم فراخوانی میکنم و از  متد های سرویس استفاده نمیکنم چون این متد ها همه ی فیلد های جدول و  navigation propertiseها را هم برمیگرداند.وفیلد ها قابل فیلتر نیست.آیا  راه حلی وجود دارد؟


شما می توانید هر گونه ... را توسط خود EF انجام دهید و اینکار را بسیار ساده کرده اما اگر جداول بزرگ و حجم داده ها هم زیاد باشد استفاده از sp ها مناسب تر است(البته EF 4 قابلیت استفاده از گوئری های کامپایل شده را نیز اضافه کرده که ...)
راه حل برای چی؟




> اگر فید هایی را از یک جدول حذف کنیم و model را update کنیم این فیلد ها  حذف نمیشه و همچنین datasourse هم update نمیشه،چیکار باید کرد؟


فیلدهای حذف شده را پس از آپدیت فقط در ظاهر Entity Model تان می بینید و می توانید دستی حذفشان کنید(این یه باگ هست...)
این هم بدیهی است چون DataSource ای که می بینید تابع Domain Service تان هست و Domain Service هم از روی Entity تان تولید می شود(فیلد هایی را که نمی خواهید در هر دو حذف کنید)




> ...متد را با true کردن loadاجرا کردم ولی همان خطایی را که گفتم داد...


 کدام خطا؟



> برای صفحه بندی اطلاعات متد را باید چطور فراخوانی کرد؟


باید هر دو به یک منبع دیتا بایند شوند.برای مثال کدهای این صفحه را ببنید.

موفق باشید

----------


## ma3566

متا سفانه لینکی که گذاشته بودید باز نشد.اگه میشه دوباره بزارید.
 من از طریق domaindata sourseمتد را اجرا کردم و datapager و datagrid را به اون بایند کردم. ولی اجرا میکنم این خطا را میدهد
.the result of a query cannot be enumerated more than once
 وقتی datapagerرا حذف میکنم datagrid رکورد ها را نمایش میدهد.

----------


## mahdi7s

سلام




> the result of a query cannot be enumerated more than once


حدس من از خطای فوق اینه که یه جا در بایند کردن DataSource به DataGrid و DataPager یا هر دو باهم درخواست Query را می کنند یا DataGrid زودتر از DataPager این در خواست رو میده!
فقط یک حدس(البته یادم هست که قبلا با یه همچین خطایی مواجه شدم ولی یادم نیست چه طور برطرفش کردم !)

برای امتحان :
بایند هایی که در XAML به DataSource انجام گرفته را حذف کنید و در کد این کار را انجام دهید (یه کدی شبیه همان آدرس که دادم).

  PagedCollectionView dataView = new PagedCollectionView(/* Your Enumerable Data */); 
  dtpPager.Source = dataView; 
  dtgGrid.ItemsSource = dataView;
  

و در مورد آن لینک هم مشکلی ندارد با IE هم امتحان کنید ولی چیز خاصی ندارد...

موفق باشید

----------


## ma3566

سلام.
با تشکر از راهنمایی هاتون.
من این متد را در سرویس نوشته ام.   

 public IQueryable<showmanbae_spResult> showmanabeasli(int codedars, string mozue,int karbar_or_modeir)
        {
 return this.ObjectContext.showmanbae_sp(codedars, mozue, karbar_or_modeir).AsQueryable

        }
با روشی که گفتید من چطور باید این متد را در pagecollectionview فراخوانی کنم.متاسفانه هر روشی را که امتحان کردم قبول نکرد.

----------


## mahdi7s

با سلام

فقط کافی است نتیجه را به عنوان پارامتر به PagedCollectionView تان بدهید:

            var spResult = yourDomainService.showmanabeasli(codedars, mozue, karbar_or_modeir);
            var dataView = new PagedCollectionView(spResult);
            dtpPager.Source = dataView;
            dtgGrid.ItemsSource = dataView;

که dtpPager همان کنترلر pager و dtgGrid همان dataGrid تان است

موفق باشید

----------


## ma3566

با سلام دوبارهممنونم که به سوال های من جواب میدهید.سوال:آیا در سیلورلایت
میشه از dllهایی مثل FarsiMsgBoxاستفاده کرد؟من از طریق add referenceخواستم این کار را انجام بدم اما خطا داد
سوال:من با فراخوانی یک sp که یک ستون را برمیگرداند میخواهم این ستون را
در comboboxنمایش دهم. من یک complex typeبرای این spساختم و این طور متد را فراخوانی کردم:bankContext combo = new
bankContext(); 
combo.Load(combo.retlistcourseQuery()); 
combodarse.ItemsSource=combo.retlistcourse_spResul  ts; 
 
اما در comboتک تک رکورد ها به این صورت اضافه میشود.مثلا: 
retlistcourse_spResults:ریاضیات مهندسی  یعنی retlistcourse_spResultsرا هم کنار فیلد ها اضافه میکند.برای حذف این عبارت من باید چیکار کنم؟ 
سوال: 
درسیلورلایت چطور میشه از کنترل errorproviderسی شارپ استفاده کرد؟ من میخواهم در صورت خالی بودن یک textboxعلامت هشدار کنار
آن ظاهر شود.

----------


## mahdi7s

سلام




> میشه از dllهایی مثل FarsiMsgBoxاستفاده کرد؟من از طریق add referenceخواستم این کار را انجام بدم اما خطا داد


نمیشه-و علت خطا اینه که آن dll تحت فریم ورک دات نت نوشته شده نه فریم ورک سیلورلات و این دو هر چند تا حدودی به هم شبیه اند ولی یکی نیستند.




> برای حذف این عبارت من باید چیکار کنم؟


لطفا کدهاتون را داخل تگ کد ( [CODE] ) بذارید...
یا باید برای آیتم های کامبو Template تعریف کنید یا خصیصه DisplyMemberPath را به نام خصیصه ای مرتبط در نتیجه Query تون قرار بدید...
مثلا :
  <ComboBox Width="200" Height="23" x:Name="combobox" DisplayMemberPath="MyProperty" />
   
  




> من میخواهم در صورت خالی بودن یک textboxعلامت هشدار کنار
> آن ظاهر شود.


کلا در برنامه های تحت وب به این Validation گفته می شود.
نگاهی به این لینک  یا این بیندازید و ...

موفق باشید

----------


## ma3566

با روشی که گفتید دوباره امتحان کردم ولی با این خطا ها مواجه شدم.
Error4
The best overloaded method match for 'System.Windows.Data.PagedCollectionView.PagedColl  ectionView(System.Collections.IEnumerable)'
 has some invalid arguments D:\blend-project\btcknowledge\btcknowledge\page\Page1.xaml.  cs
وخطای دوم
Error2
Argument 1: cannot convert from 'System.ServiceModel.DomainServices.Client.EntityQ  uery<btcknowledge.Web.showmanbae_spResult>'
 to 'System.Collections.IEnumerable' D:\blend-project\btcknowledge\btcknowledge\page\Page1.xaml.  csنوع متد را به ienumerable تغییر دادم ولی همین خطا را داد.

----------


## mahdi7s

سلام

خطاهای بسیار ساده و قابل فهمی هستند و اصلا ربطی سیلورلایت هم ندارن!

اولی گفته سازنده PagedCollectionView یک IEnumerable قبول می کند...
دومی هم گفته EntityQuery رو نمی تون به Enumerable  تبدیل کنه...

پیشنهاد من اینه که شما اگر به نتیجه ی Query در کلاینت نیازی ندارید آن را به لیست تبدیل کنید و به کلاینت بفرستید

موفق باشید

----------


## ma3566

سلام

تگ [code] را کجا باید استفاده کرد؟کد های سی
شارپ را در این تگ بنویسم.من این تگ را پیدا نکردم. 
سوال:چطور میشه به یک سطر خاص از datagridدسترسی داشت؟خاصیتی مثل position در سی شارپ را اینجانداریم؟ 
متدی که در سرویس یک رکورد را بر میگرداند،من میخوام نتیجه ی این رکورد را در متغییری بریزم که به تک تک فیلد های این رکورددسترسی داشته باشم ، متغییر از نوع جدول که این رکورد را دارد  تعریف میکنم،تبدیل نوع هم انجام میدم ولی خطا میدهدراه حل چیه؟

----------


## mahdi7s

سلام

بر روی دکمه *#* کلیک کنید خودش تک را به متن اضافه می کند سپس کدتان را بین دو تگ قرار بدین...




> چطور میشه به یک سطر خاص از datagridدسترسی داشت؟خاصیتی مثل position در سی شارپ را اینجانداریم؟


با استفاده از خصیصه های SelectedItem و ItemsSource و ...




> من میخوام نتیجه ی این رکورد را در متغییری بریزم که به تک تک فیلد های این رکورددسترسی داشته باشم


یک کلاس تعریف کنید و آن متغییرهای که می خواهید به صورت خصیصه تعریف کنید و سپس نتیجه کوئری را داخل آن کلاس بریزید

موفق باشید

----------


## ma3566

سلام 

متاسفانه من هنوز موفق به صفحه بندی اطلاعات دریافتی از بانک  نشدم،همان طور که گفتید
نوع متد را به Ilist تبدیل کردم و خروجی متد را به عنوان لیست فرستادم اما PagedCollectionViewاین را هم به عنوان ورودی قبول نمی کند و همان دو خطای قبلی
را میدهد.در MSDNپیدا کردم که با همین روش باید از datapagerو datagridاستفاده کرد ولی خروجی متد را به صورت (e.result)به PagedCollectionViewفرستاده بود من چطور میتونم متد را به این صورت اجرا کنم که متغیر PagedCollectionViewآنرا به عنوان پارامتر قبول کند؟ 
سوال: 
با خصوصیت selecteditemدر datagridبه فیلد های سطر انتخابی میشه دسترسی داشت ونه هر سطری  من میخوام به یک سطر خاص دسترسی داشته باشم ؟راحل
دوم را امتحان میکنم.ممنون از راهنمایی هاتون.

----------


## mahdi7s

سلام




> همان طور که گفتید
> نوع متد را به Ilist تبدیل کردم و خروجی متد را به عنوان لیست فرستادم اما PagedCollectionViewاین را هم به عنوان ورودی قبول نمی کند و همان دو خطای قبلی
> را میدهد


شما با کد زیر مشکل دارید؟!
PagedCollectionView pcv = new PagedCollectionView(new List<string>());




> با خصوصیت selecteditemدر datagridبه فیلد های سطر انتخابی میشه دسترسی داشت ونه هر سطری  من میخوام به یک سطر خاص دسترسی داشته باشم ؟


به کدوم سطر؟(یک مثالی / توضیحی - غیب که نمی دانم! :چشمک: )

موفق باشید

----------


## ma3566

سلام
با استفاده از خاصیت dataview کنترل datasourse هم میشه رکورد ها را صفحه بندی کرد
PagedCollectionView pcv = new PagedCollectionView(mydomaindatasourse.dataview);
----به کدوم سطر؟
Datagridخاصیتی دارد که بتونیم اندیس سطر و ستون را مشخص کنیم ؟
یا مثلا در datagridیک رکورد بیشتر وجود ندارد آیا میشه مقدار تک تک
فیلد های این رکورد را خواند؟
سوال:با متد select()چطور میشه اطلاعات دریافتی از بانک را فیلتر
کرد؟نام چند فیلد را چطور به این متد بدهیم؟با یک فیلد درست جواب میدهTable.select(a=>a.code_karbar).
سوال:دکمه# کجاست؟که تگ [CODE]را اضافه میکند.

----------


## mahdi7s

سلام

ببخشید کمی دیر شد(اینترنتم ترکید!)




> Datagridخاصیتی دارد که بتونیم اندیس سطر و ستون را مشخص کنیم ؟


 خصیصه SelectedIndex




> یا مثلا در datagridیک رکورد بیشتر وجود ندارد آیا میشه مقدار تک تک
> فیلد های این رکورد را خواند؟


شما گریدتان را به یک منبع بایند کردید وقتی می دانید کدام یک از اعضای آن منبع انتخاب شده (با استفاده از SelectedItem) می توانید هر تغییری در منبع ایجاد کنید که به ظاهر هم انتقال پیدا می کند(پیشنهاد می کنم کمی بر روی بایندینگ ها در سیلور بیشتر مطالعه کنید)




> با متد select()چطور میشه اطلاعات دریافتی از بانک را فیلتر
> کرد؟نام چند فیلد را چطور به این متد بدهیم؟با یک فیلد درست جواب میده


با کدی شبیه این:
lst.Select(a => new { A = a.Item1, B = a.Item2, C = a.Item3 });




> سوال:دکمه# کجاست؟که تگ [CODE]را اضافه میکند.


 :گریه:   دقیقا بالای جایی که می خواهید متن پستتان را بنویسید دکمه *#* وجود دارد

موفق باشید

----------


## ma3566

سلام
مشکل:
 پیش میاد وقتی متد جدیدی را به سرویس اضافه میکنم  دیگه datasource را نمیشناسد؛ وحتی از پنجره ی datasourceهم حذف میشود و با خطا های زیادی مواجه میشم.
مثلا من برای update کردن اطلاعات یک جدول با استفده از خصوصیت attachو submitchangeیک رکورد جدید را به متد سرویس فرستادم ولی تغییرات در بانک اعمال نشده بود من یک spبرای این کار نوشتم و آن را در سرویس  فراخوانی کردم و درست انجام داد.نوع متد در سرویس را intتعریف کردم ولی متد دیگه ای که یک sp مثل قبلی را اجرا میکرد تعریف کردم با نوع void که مشکلی که گفتم پیش آمد فکر میکنید چون من از خود متد های سرویس استفاده نکردم برای سرویس اینطور شد؟
تشکر.

----------


## ma3566

سلام
من متد select را همون طور که گفتید تعریف کردم که دو فیلد از یک جدول را selectمیکند ولی در اجرا خطا می دهد.
return this.ObjectContext.manabe_tbl.Select(a => new manabe_tbl() { name_manbae = a.name_manbae, tozieh_taeid =.tozieh_taeid }).ToList
();آیا من باید یک کلاس در برنامه تعریف کنم با نام این دو فیلد که یکیشو به عنوان کلید تعریف کنم؟ اگه اینطور است من باید این کلاس را کجا اضافه کنم؟

----------


## mahdi7s

سلام




> مثلا من برای update کردن اطلاعات یک جدول با استفده از خصوصیت attachو  submitchangeیک رکورد جدید را به متد سرویس فرستادم ولی تغییرات در بانک  اعمال نشده بود


برای ذخیره تغییرات از متد SaveChanges استفاده کنید




> چون من از خود متد های سرویس استفاده نکردم برای سرویس اینطور شد؟


چطور شد؟
اگر منظورتان از سرویس مشتقات DomainService است/این کلاس ها را می توانید تغییر دهید ولی اگر به کدهای خودش هم نگاه کنید متوجه کمی قوانین از جمله تعریف metadata ها می شوید




> ولی در اجرا خطا می دهد.


متن خطا را بگذارید

نهایتا پیشنهاد می کنم کمی بیش تر در زمینه Ria Services مطالعه کنید یا حداقل پروژه این سمپل را به همراه جزوه توضیحاتش کمی بررسی و مطالعه کنید.(دانلود فایل های walkthrough و HRAppCS_VS2010 کافی است)

موفق باشید

----------


## ma3566

سلام 
ممنون برای لینکی که گذاشتید
من هم برای حل مشکلاتم از msdn  خیلی استفاده میکنم اما بعضی وقتها راحل هایی رو که داده اجرا میکنم جواب نمیده

متن خطا: پنجره just-in-time debuggerباز میشود 
an unhandeled exception  unhandeled error in silverlight application
code 4004
category:managed runtime error
message:system.servicemode.domainservices.client.d  omainopration exeption

----------


## mahdi7s

سلام

متن خطا میگه وقتی یکی از متدهای کلاس DomainService تان را در کلاینت فراخوانی می کنید یک خطا رخ می دهد.

پیشنهاد می کند در زمان اجرا آن متد خاص را با گذاشتن Break point ها خط به خط بررسی کنید(Stake trace رو هم نگاه کنید بدک نیست)

----------


## ma3566

سلام
من هر کدوم از متدهای سرویس را که فراخوانی میکنم در اجرا همین خطا را میدهد addکردن با متدهای سرویس یا updateو...
ولی اگر با sp ها  کار کنم و کل کار با بانک را با spانجام دهم و در سرویس فراخوانی کنم مشکل ندارم نمی دونم مشکل از چیه؟میتونید راهنمایی کنید؟ممنونم.

----------


## ma3566

سلام
سوال:بعد از تعریف validation ها در metadata.csبرای اجرای این validationها باید چیکار کرد آیا حتما باید از dataform استفاده کرد؟اگر من از textbox استفاده کنم که خصوصیت text را به این صورت تعریف کنم 
="{Binding Path=email, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}"
الان با قرار دادن یک دکمه که عمل submitchangeرا انجام دهد من میتونم این validation ها رو اجرا کنم ؟مقدار این text ها را چطور به متد addبفرستم؟

----------


## mahdi7s

> ...ولی اگر با sp ها  کار کنم...


چون دیگر کد را خود VS تولید می کند(و البته بدون خطا) :چشمک: 
(نظر من همان پست 28 است)




> بعد از تعریف validation ها در metadata.csبرای اجرای این validationها باید چیکار کرد آیا حتما باید از dataform استفاده کرد؟


نوع برنامه تون چیه؟ (در حال حاضر اگر یک Business App باشد نیازی به DataForm نیست در غیر اینصورت بله)




> الان با قرار دادن یک دکمه که عمل submitchangeرا انجام دهد من میتونم این validation ها رو اجرا کنم ...


پروپرتی ها به تکست باکس بایند شده؟ ->یله / البته بدون کلیک و با برداشته شدن فوکوس هم عمل Validation می بایست عمل کند.
مقدارشان را از منبعی که به آن بایند شده بگیرید(سمپلی که گفتم را انشاا... نگاه کردید)

موفق باشید

----------


## ma3566

سلام 
پروژه من از نوع navigation appاست تقریبا مشکلم با validation حل شد.
سوال:شما فکر میکنید استفاده از spبرای کار با بانک بهتر است یا با خود EF؟بهتر نیست کار با داده ها را به sql بسپاریم؟
سوال:wcfبا wcf ria serviceچه فرقی دارد آِیا مزیتی نسبت به هم دارند؟

----------


## mahdi7s

سلام

به شخصه دوست ندارم قدرت و دینامیک بودن EF را با SP ها و View ها محدود کنم
EF چیز ساده ای نیست در حالی که ما به خاطر سادگی کارمون ازش استفاده می کنیم! (کوچکترین کتب موجود که در زمینه EF دیدم حداقل 500 صفحه داشته اند)

شما می توانید امکانات جدید اضافه شده در اینجا مشاهده کنید

البته استفاده از SP ها هم مخصوصا در دیتابیس ها بزرگ تاثیر بسزایی بر روی سرعت برنامه داره...
(البته اینها نظرات من بود)




> wcfبا wcf ria serviceچه فرقی دارد آِیا مزیتی نسبت به هم دارند؟


وجه مشترکشان WCF است!
و WCF RIA Services (همونطور که اسمش پیداست) خدمات بیشتری را برای استفاده در Rich Internet Applications را به WCF اضافه می کند(از جمله ایجاد کلاس های Domain Service با چند کلیک).

موفق باشید

----------


## ma3566

سلام 
من با کد های زیر نمی تونم رکوردها را ویرایش کنم خطا نمیده ولی تغییرات در بانک اعمال نمی شود؟

private
 
 
void updatekarbar_click(object sender, RoutedEventArgs e)

 
        {

 
          

karbar_tbl newk=newkarbar_tbl();

 
            newk.code_karbar = code_karbar;

 
            newk.name_karbar=name_karbaryp.Text;

 
            newk.password=passwordp.Password;

 
            newk.name=name_kp.Text;

 
            newk.familly=famillyp.Text;

 
            newk.email=emailp.Text;

 
            

bankContext update = newbankContext();

 
            update.karbar_tbls.Attach(newk);

 
            update.SubmitChanges(SubmitOperation_Callback, 

null);
}


public


void UpdateKarbar_tbl(karbar_tbl currentkarbar_tbl)

 
        {

 
            

this.ObjectContext.karbar_tbl.AttachAsModified(current  karbar_tbl, this.ChangeSet.GetOriginal(currentkarbar_tbl));

 
            

this.ObjectContext.SaveChanges();

 
        }

----------


## mahdi7s

سلام

واقعیتش من چندان متوجه کدهاتون نشدم ولی خودم با توجه به برداشتی که از نیازتون دارم کمی توضیح میدم:

شما در یک صفحه با نام EmployeeList یک لیستی از تمام Employee هاتون را به وسیله DomainDataSource تون می گیرید و نمایش می دهید.
یکی از Employee ها را انتخاب می کنید و بر روی دکمه Update کلیک می کنید و این Employee را به یک پنجره دیگه(یا یک ChildWindow) می فرستید و آنجا آن را ویرایش می کنید و بر می گیردید به پنجره لیست ها و سپس لیستتان را آپدیت می کنید.

نمونه کد این می شود کلاس EmployeeList و EmployeeRegistrationWindow در پروژه مثالی که در چند پست قبل بهتون معرفی کردم(حتما یک نگاهی بندازید)

----------


## ma3566

سلام
برداشتتون درسته،من همین کار رو میخوام انجام بدم.
من مثالی رو که گفتید قبلا دیدم اونجا با قراردادن این کد در دکمه submit 
()employeeDataSource.submitchanges آپدیت اطلاعات را انجام داده با این روش میشه آپدیت رو انجام داد اما مشکلی که من دارم اگر کاربر بدون توجه به پیام های validationدکمه submit را بزنند در اجرا خطا پیش میاد و پنجرهvisual studio just-in-timedibugerباز میشود
ومن نمیتونم این خطا رو خودم در کد (مثلا با try,catch )مدیریت کنم روشی که کدشو قبلا گذاشتم با فراخوانی یک متد خطا های ناشی از.submitchanges را handelمیکرد،که متاسفانه جواب نمیده.حالا با این روش که در پروژه مثال گفته چطور میشه خطا را با یک پیام به کاربر نشان داد؟ مثلا اگر کاربر یک فیلد را خالی گذاشت و به پیام خطاهای validation توجه نکرد و دکمه submitرا زد یه پیام خطا نمایش بدیم و نزاریم پنجره visual studio just-in ...باز شود؟

----------


## mahdi7s

سلام




> مشکلی که من دارم اگر کاربر بدون توجه به پیام های validationدکمه submit  را بزنند در اجرا خطا پیش میاد و پنجرهvisual studio  just-in-timedibugerباز میشود


ساده ترین راه حل چک کردن کنترلرها از داشتن خطا قبل از submit کردن دیتا هست.برای انجام اینکار کافی است کنترلری(مثلا یک تکست باکس) که می خواهید خطایش را چک کنید به عنوان پارامتر به متد Validation.GetHasError ارسال کنید اگر true بود یعنی خطا داره و شما نباید submit کنید و در غیر اینصورت ...

شما در مواقعی که می خواهید تعداد زیادی کنترلر را چک کنید می توانید داخل فرزندان پنل اصلی گردش کنید و با توجه به نوع کنترلرهایی که می خواهید/ آن ها را نتخاب و چک کنید...

*راه حل زیبا تر و الگومند تر پیاده سازی رابط IDataErrorInfo و امثالش! هست. نمونه =>
{
http://johnpapa.net/silverlight/enab...dataerrorinfo/

-
http://jesseliberty.com/2010/07/25/d...nd-templating/
}

موفق باشید

----------


## ma3566

سلام
در کلاس هایی که برای custom validationتعریف میکنیم میشه به متد هایی که در سرویس تعریف شده اند دسترسی داشت؟ مثلا دسترسی به اطلاعات یک جدول؟این کلاس ها را از طریق add->new item->codefileایجاد کرده ام فضای نام ها را هم اضافه کردم ولی متد های سرویس را نشناخت.

----------


## mahdi7s

> در کلاس هایی که برای custom validationتعریف میکنیم


منظورتان کلاس هایی است که با صفت Metadata مزین شده اند؟ این کلاس ها برای چسباندن برخی از رفتارها و صفت ها به entity تولید شده استفاده می شوند تا اگر دوباره entity تان را تولید یا آپدیت کردید این Metadata ها پاک نشوند.




> ولی متد های سرویس را نشناخت


 چون این کلاس ها با Entity تولید شده کار می کنند نه سرویس.

شما کدهایی که می خواهید در سرور اجرا شوند را فقط می توانید در مشتقات سرویستان پیاده کنید.

----------


## ma3566

سلام 
منظورتون را کامل متوجه نشدم.من می خواهم مقدار فیلد نام کاربری که از کاربر دریافت می کنم را در جدول چک کنم که این مقدار تکراری نباشد می خواهم این کار را با validationها انجام دهم؟باید در سرویس کلاسی برای انجام این کار تعریف کنم یا یک کلاس جدید در پروژه addکنم ؟

----------


## mahdi7s

سلام




> من می خواهم مقدار فیلد نام کاربری که از کاربر دریافت می کنم را در جدول  چک کنم که این مقدار تکراری نباشد می خواهم این کار را با validationها  انجام دهم؟باید در سرویس کلاسی برای انجام این کار تعریف کنم یا یک کلاس  جدید در پروژه addکنم ؟


سلام می خواهید اینکارو بوسیله ی یک صفت(Attribute) انجام دهید؟
(
این شیوه به دو طریق قابل انجام است:
1) یک کلاس ایستا به همراه متدهایی که برای Validation می خواهید و استفاده از صفت CustomAttribute
2) ایجاد یک مشتق از کلاس ValidationAttribute
)

دو شیوه ی فوق چندان کاری ندارند ولی استفاده از سرویس ها و ... داخل متد Validation کمی کد نویسی بیشتر می خواهد و این شامل کلاینت هم می شود. 

این در حالی است که شما می توانید این کارو ساده تر و با استفاده تکنیکهای دیگر Validation انجام دهید
(
مثلا پرتاب یک خطا در متد set خصیصه ای که می خواهید مقدارش را چک کنید(این ساده ترین است)
یا پیاده سازی آن رابطهایی که قبلا گفتم(خودم این یکی را بیشتر می پسندم)
)

سعی می کنم یک سمپل که با Attribute ها اینکارو انجام میده براتون درست کنم ...

موفق باشید

----------


## mahdi7s

سلام

سمپل رو می تونید از اینجا دانلود کنید

توضیحات:

-در پروژه وب داخل فایل CustomValidators.shared کلاس موجود برای اعتبارسنجی وجود دارد که داخل اون ما از سرویسمان استفاده کردیم.برای این که بتونیم از سرویس در این کلاس بهره بگیریم یک سری تنظیمات لازمه که داخل متد Initialize در سرویس(StudentDomainService) انجام شده.

-به همین ترتیب برای این که DomainContext در پروژه کلاینت بتواند از اعتبارسنجی ما بهره بگیرید ما باید به آن بفهمانیم که چه طوری می تواند اطلاعات را از سرویسی برای اعتبازسنجی به دست بیاورد که کدهای آن داخل شاخه Generated_Code بوسیله دو کلاس ContextServiceProvider و StudentDomainContext پیاده شده اند.

موفق باشید

----------


## ma3566

سلام
ممنون - راحل هایی رو که گفتید امتحان می کنم.

----------

