PDA

View Full Version : سوال:نحوه فراخوانی storeprocedure در wcf ria service



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

mahdi7s
یک شنبه 05 دی 1389, 00:24 صبح
سلام

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

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

this.ObjectContext.MyProcedure(...);

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

موفق باشید

ma3566
دوشنبه 06 دی 1389, 20:16 عصر
من sp ها را فراخوانی کردم همه اجرا میشه ولی spهای از نوع selectکه در sql درست اجرا میدهد اینجا فقط یک رکورد بر می گردونه. نوع متد IQueryable تعریف کردم.و Ilist هم تعریف میکنم همین مشکل را دارد.راه حل چیه؟

mahdi7s
پنج شنبه 09 دی 1389, 10:42 صبح
این مشکل از Entity Framework نیست و از سرویس ها هم نیست به احتمال زیاد یا جوابی که select شما می خواهد یکی بیشتر نیست و یا در متدی که برای پروسیجرتان تعریف کردید کدی باعث این خطا شده...

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

ma3566
جمعه 10 دی 1389, 23:22 عصر
ولی 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
شنبه 11 دی 1389, 15:27 عصر
سوال:فیلد هایی که با عنوان Navigation propertiesدر انتهای جدول ها در مدل اضافه میشود،برای چیه؟
آیا میشه این فیلد ها را حذف کرد؟

mahdi7s
یک شنبه 12 دی 1389, 18:02 عصر
سلام

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


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


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


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

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

mahdi7s
دوشنبه 13 دی 1389, 16:03 عصر
سلام


میشه توضیح بدهید که چطور از navigation propertise ها استفاده کرد؟
مثلا اگر بین دو جدول TableOne و TableTwo به ترتیب رابطه یک به چند وجود داشته باشد در Entity ایجاد شده برای جدول TableOne شما یک Navigation Property با نام TableTwos دارید که بوسیله این خصیصه شما می تونید تمام 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اجرا کردم ولی همان خطایی را که گفتم داد... کدام خطا؟

برای صفحه بندی اطلاعات متد را باید چطور فراخوانی کرد؟ باید هر دو به یک منبع دیتا بایند شوند.برای مثال کدهای این (http://msdn.microsoft.com/en-us/library/system.windows.controls.datapager%28v=vs.95%29.asp x)صفحه را ببنید.

موفق باشید

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

mahdi7s
چهارشنبه 15 دی 1389, 11:15 صبح
سلام


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
پنج شنبه 16 دی 1389, 16:37 عصر
سلام.
با تشکر از راهنمایی هاتون.
من این متد را در سرویس نوشته ام.


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
پنج شنبه 16 دی 1389, 22:52 عصر
با سلام

فقط کافی است نتیجه را به عنوان پارامتر به 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
جمعه 17 دی 1389, 17:55 عصر
با سلام دوباره

ممنونم که به سوال های من جواب میدهید.
سوال:آیا در سیلورلایت
میشه از 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
جمعه 17 دی 1389, 19:16 عصر
سلام


میشه از dllهایی مثل FarsiMsgBoxاستفاده کرد؟من از طریق add referenceخواستم این کار را انجام بدم اما خطا داد
نمیشه-و علت خطا اینه که آن dll تحت فریم ورک دات نت نوشته شده نه فریم ورک سیلورلات و این دو هر چند تا حدودی به هم شبیه اند ولی یکی نیستند.


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




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

کلا در برنامه های تحت وب به این Validation گفته می شود.
نگاهی به این لینک (http://www.codeproject.com/Articles/86955/Silverlight-4-Data-Validation-Tip-of-the-Day-Part-.aspx)یا این (http://johnpapa.net/silverlight/enabling-validation-in-silverlight-4-with-idataerrorinfo/)بیندازید و ...

موفق باشید

ma3566
جمعه 17 دی 1389, 20:31 عصر
با روشی که گفتید دوباره امتحان کردم ولی با این خطا ها مواجه شدم.
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
شنبه 18 دی 1389, 11:38 صبح
سلام

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

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

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

موفق باشید

ma3566
شنبه 18 دی 1389, 14:39 عصر
سلام


تگ [code] را کجا باید استفاده کرد؟کد های سی
شارپ را در این تگ بنویسم.من این تگ را پیدا نکردم.


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


متدی که در سرویس یک رکورد را بر میگرداند،من میخوام نتیجه ی این رکورد را در متغییری بریزم که به تک تک فیلد های این رکورددسترسی داشته باشم ، متغییر از نوع جدول که این رکورد را دارد تعریف میکنم،تبدیل نوع هم انجام میدم ولی خطا میدهدراه حل چیه؟

mahdi7s
شنبه 18 دی 1389, 22:13 عصر
سلام

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


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


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

موفق باشید

ma3566
یک شنبه 19 دی 1389, 19:38 عصر
سلام


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


سوال:


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

mahdi7s
دوشنبه 20 دی 1389, 14:43 عصر
سلام


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

PagedCollectionView pcv = new PagedCollectionView(new List<string>());


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

موفق باشید

ma3566
سه شنبه 21 دی 1389, 18:08 عصر
سلام
با استفاده از خاصیت dataview کنترل datasourse هم میشه رکورد ها را صفحه بندی کرد
PagedCollectionView pcv = new PagedCollectionView(mydomaindatasourse.dataview);

----به کدوم سطر؟

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

mahdi7s
پنج شنبه 30 دی 1389, 17:19 عصر
سلام

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


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


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


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

lst.Select(a => new { A = a.Item1, B = a.Item2, C = a.Item3 });


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

موفق باشید

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

ma3566
شنبه 02 بهمن 1389, 09:07 صبح
سلام
من متد select را همون طور که گفتید تعریف کردم که دو فیلد از یک جدول را selectمیکند ولی در اجرا خطا می دهد.

return this.ObjectContext.manabe_tbl.Select(a => new manabe_tbl() { name_manbae = a.name_manbae, tozieh_taeid =.tozieh_taeid }).ToList
();

آیا من باید یک کلاس در برنامه تعریف کنم با نام این دو فیلد که یکیشو به عنوان کلید تعریف کنم؟ اگه اینطور است من باید این کلاس را کجا اضافه کنم؟

mahdi7s
شنبه 02 بهمن 1389, 18:41 عصر
سلام


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


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


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

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

نهایتا پیشنهاد می کنم کمی بیش تر در زمینه Ria Services مطالعه کنید یا حداقل پروژه این (http://code.msdn.microsoft.com/RiaServices/Release/ProjectReleases.aspx?ReleaseId=2387)سمپل را به همراه جزوه توضیحاتش کمی بررسی و مطالعه کنید.(دانلود فایل های walkthrough و HRAppCS_VS2010 کافی است)

موفق باشید

ma3566
شنبه 02 بهمن 1389, 20:25 عصر
سلام
ممنون برای لینکی که گذاشتید
من هم برای حل مشکلاتم از 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
دوشنبه 04 بهمن 1389, 19:37 عصر
سلام

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

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

ma3566
سه شنبه 05 بهمن 1389, 21:27 عصر
سلام
من هر کدوم از متدهای سرویس را که فراخوانی میکنم در اجرا همین خطا را میدهد addکردن با متدهای سرویس یا updateو...
ولی اگر با sp ها کار کنم و کل کار با بانک را با spانجام دهم و در سرویس فراخوانی کنم مشکل ندارم نمی دونم مشکل از چیه؟میتونید راهنمایی کنید؟ممنونم.

ma3566
چهارشنبه 06 بهمن 1389, 12:32 عصر
سلام
سوال:بعد از تعریف validation ها در metadata.csبرای اجرای این validationها باید چیکار کرد آیا حتما باید از dataform استفاده کرد؟اگر من از textbox استفاده کنم که خصوصیت text را به این صورت تعریف کنم

="{Binding Path=email, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true, TargetNullValue=''}"

الان با قرار دادن یک دکمه که عمل submitchangeرا انجام دهد من میتونم این validation ها رو اجرا کنم ؟مقدار این text ها را چطور به متد addبفرستم؟

mahdi7s
چهارشنبه 06 بهمن 1389, 13:56 عصر
...ولی اگر با sp ها کار کنم...
چون دیگر کد را خود VS تولید می کند(و البته بدون خطا):چشمک:
(نظر من همان پست 28 است)


بعد از تعریف validation ها در metadata.csبرای اجرای این validationها باید چیکار کرد آیا حتما باید از dataform استفاده کرد؟
نوع برنامه تون چیه؟ (در حال حاضر اگر یک Business App باشد نیازی به DataForm نیست در غیر اینصورت بله)


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

موفق باشید

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

mahdi7s
پنج شنبه 07 بهمن 1389, 16:07 عصر
سلام

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

شما می توانید امکانات جدید اضافه شده در اینجا (http://www.develop.com/entityframework4)مشاهده کنید

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


wcfبا wcf ria serviceچه فرقی دارد آِیا مزیتی نسبت به هم دارند؟
وجه مشترکشان WCF است!
و WCF RIA Services (همونطور که اسمش پیداست) خدمات بیشتری را برای استفاده در Rich Internet Applications (http://en.wikipedia.org/wiki/Rich_Internet_application) را به WCF اضافه می کند(از جمله ایجاد کلاس های Domain Service با چند کلیک).

موفق باشید

ma3566
سه شنبه 12 بهمن 1389, 17:50 عصر
سلام
من با کد های زیر نمی تونم رکوردها را ویرایش کنم خطا نمیده ولی تغییرات در بانک اعمال نمی شود؟


private


void updatekarbar_click(object sender, RoutedEventArgs e)


{




karbar_tbl newk=new karbar_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 = new bankContext();


update.karbar_tbls.Attach(newk);


update.SubmitChanges(SubmitOperation_Callback,

null);
}



public


void UpdateKarbar_tbl(karbar_tbl currentkarbar_tbl)


{




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




this.ObjectContext.SaveChanges();


}

mahdi7s
دوشنبه 18 بهمن 1389, 00:24 صبح
سلام

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

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

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

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

mahdi7s
چهارشنبه 20 بهمن 1389, 01:24 صبح
سلام


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

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

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

*راه حل زیبا تر و الگومند تر پیاده سازی رابط IDataErrorInfo و امثالش! هست. نمونه =>
{
http://johnpapa.net/silverlight/enabling-validation-in-silverlight-4-with-idataerrorinfo/

-
http://jesseliberty.com/2010/07/25/data-validation-and-templating/
}

موفق باشید

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

mahdi7s
پنج شنبه 21 بهمن 1389, 20:58 عصر
در کلاس هایی که برای custom validationتعریف میکنیم
منظورتان کلاس هایی است که با صفت Metadata مزین شده اند؟ این کلاس ها برای چسباندن برخی از رفتارها و صفت ها به entity تولید شده استفاده می شوند تا اگر دوباره entity تان را تولید یا آپدیت کردید این Metadata ها پاک نشوند.


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

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

ma3566
شنبه 23 بهمن 1389, 18:14 عصر
سلام
منظورتون را کامل متوجه نشدم.من می خواهم مقدار فیلد نام کاربری که از کاربر دریافت می کنم را در جدول چک کنم که این مقدار تکراری نباشد می خواهم این کار را با validationها انجام دهم؟باید در سرویس کلاسی برای انجام این کار تعریف کنم یا یک کلاس جدید در پروژه addکنم ؟

mahdi7s
یک شنبه 24 بهمن 1389, 22:06 عصر
سلام


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

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

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

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

موفق باشید

mahdi7s
دوشنبه 25 بهمن 1389, 16:45 عصر
سلام

سمپل رو می تونید از اینجا (http://cid-8b3b5259a5661cf0.office.live.com/self.aspx/.Documents/Codes/CustomValidationAttribute%5E5DataAnnotation%5E6.ra r)دانلود کنید

توضیحات:

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

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

موفق باشید

ma3566
سه شنبه 26 بهمن 1389, 09:40 صبح
سلام
ممنون - راحل هایی رو که گفتید امتحان می کنم.