PDA

View Full Version : سوال: در نظر نگرفتن Annotation های required در EF



mehdin69
یک شنبه 24 فروردین 1393, 09:52 صبح
سلام دوستان من یک جدول دارم که چندتا از فیلدهاش توی EF و در Annotation بصورت required هستند
حالا من چندتا View دارم که توی هر کدام از View ها بعضی از این فیلد ها رو نگذاشتم
و وقتی دکمه ذخیره زده میشه میگه اون فیلدهای required رو که در Annotation ثبت کردی هم وارد کن
بطور مثال
فیلدهای
A,B,C,D,E,F را در EF داریم که فیلدهای A,B,C بصورت required هستند حالا در
View1 فیلد های A,E
در View2 فیلدهای B,D
در View3 هم فیلدهای C,F وجود دارند
و توی هر کدام از View ها میخوام ذخیره رو انجام بدم ارور دارم که این required می باشد
حالا نظر شما چیه برای حل این مشکل؟!!!

sunn789
یک شنبه 24 فروردین 1393, 09:59 صبح
سلام
میتونی از Binding ها استفاده کنید اگه اشتباه نکنم
مثل این
public ActionResult Edit([Bind(Include="ID,NationalCode,FName,LName,FatherName,BCN,Personn elNumber,DossierNumber,Phone,Mobile,Stockholder,Ad dress,Description,EmployType,CreateDate,Modifaydat e,f_PersonalCode,RealMember")] tblMember tblmember)

Mojtaba.Shateri
یک شنبه 24 فروردین 1393, 10:01 صبح
سلام دوستان من یک جدول دارم که چندتا از فیلدهاش توی EF و در Annotation بصورت required هستند
حالا من چندتا View دارم که توی هر کدام از View ها بعضی از این فیلد ها رو نگذاشتم
و وقتی دکمه ذخیره زده میشه میگه اون فیلدهای required رو که در Annotation ثبت کردی هم وارد کن
بطور مثال
فیلدهای
A,B,C,D,E,F را در EF داریم که فیلدهای A,B,C بصورت required هستند حالا در
View1 فیلد های A,E
در View2 فیلدهای B,D
در View3 هم فیلدهای C,F وجود دارند
و توی هر کدام از View ها میخوام ذخیره رو انجام بدم ارور دارم که این required می باشد
حالا نظر شما چیه برای حل این مشکل؟!!!

منظورتون از View در اینجا چیه؟

mehdin69
یک شنبه 24 فروردین 1393, 10:06 صبح
منظور View هایی هست که به کنترلرهام متصل هستن
منظور شما از این خط کد چیه؟

mehdin69
یک شنبه 24 فروردین 1393, 10:06 صبح
یعنی چی از Binding ؟؟؟
Binding رو کجا استفاده کنم ؟؟؟

sunn789
یک شنبه 24 فروردین 1393, 10:23 صبح
این Binding رو توی کنترل استفاده میکنید توی پرانتزهای action result

sunn789
یک شنبه 24 فروردین 1393, 10:24 صبح
منظورتون از View در اینجا چیه؟
با این حساب بررسی ویو بیشتر لازمه

mehdin69
یک شنبه 24 فروردین 1393, 10:27 صبح
خب کجای این bهbinding گفته شده که وارد کردن این اطلاعات ضروری هست؟

Mojtaba.Shateri
یک شنبه 24 فروردین 1393, 10:30 صبح
منظور View هایی هست که به کنترلرهام متصل هستن
منظور شما از این خط کد چیه؟

وقتی با هر View مجزا فقط چند فیلد از Table ذخیره میشود ، و بقیه Null می ماند ، این یعنی باید جدولتونو چند جدول کنید تا حدالامکان عناصر تکراری حذف شود.

sunn789
یک شنبه 24 فروردین 1393, 10:31 صبح
به actionresult شما میگه که به کدام Property ها Bind شه و از کدومها صرف نظر کنه که همون کلمه Include و Exclude این مفهوم ها رو میرسونن

mehdin69
یک شنبه 24 فروردین 1393, 11:03 صبح
به actionresult شما میگه که به کدام Property ها Bind شه و از کدومها صرف نظر کنه که همون کلمه Include و Exclude این مفهوم ها رو میرسونن
احسنت
حالا توی Annotation می تونیم ErrorMessage رو وارد کنیم که مثلاً اگه فیلد A ذو وارد نکرد یه ارروری چیزی بده اینجا ErrorMessage رو کجا وارد کنیم؟

mehdin69
یک شنبه 24 فروردین 1393, 11:05 صبح
وقتی با هر View مجزا فقط چند فیلد از Table ذخیره میشود ، و بقیه Null می ماند ، این یعنی باید جدولتونو چند جدول کنید تا حدالامکان عناصر تکراری حذف شود.

دوست عزیز شما درست می فرمایید اما امکان این کار در حال حاظر برای ما وجود نداره ...
:(

sunn789
یک شنبه 24 فروردین 1393, 11:23 صبح
این کار رو تا به حال با این صورت که شما میفرمایید انجام ندائم اما به نظرم باید از خود Annotation استفاده کنه و نیاز نیست شما چیزی بنویسید

Mojtaba.Shateri
یک شنبه 24 فروردین 1393, 11:29 صبح
دوست عزیز شما درست می فرمایید اما امکان این کار در حال حاظر برای ما وجود نداره ...
:(
با این حساب شما میتونید در Action مربوطه که قراره عمل Save انجام بده ، بقیه اطلاعات اون کلاس رو با یک مقداری پیشفرض که به صورت قرارداری اون رو خالی در نظر میگیرید پر کنید. مثلا برای int بگید عدد -1 یعنی خالی و برای nvarchar بگید "\0" یعنی NULL.
اینجوری نیازی نیست Annotation هارو دستکاری کنید. و البته بهتره که دستکاری نکنید. چون منطقا باید هر کلاس جداگانه پر بشه و به DbContext اضافه بشه. بعدا هم به راحتی میتونید برنامه رو توسعه بدید .

mehdin69
یک شنبه 24 فروردین 1393, 11:47 صبح
با این حساب شما میتونید در Action مربوطه که قراره عمل Save انجام بده ، بقیه اطلاعات اون کلاس رو با یک مقداری پیشفرض که به صورت قرارداری اون رو خالی در نظر میگیرید پر کنید. مثلا برای int بگید عدد -1 یعنی خالی و برای nvarchar بگید "\0" یعنی NULL.
اینجوری نیازی نیست Annotation هارو دستکاری کنید. و البته بهتره که دستکاری نکنید. چون منطقا باید هر کلاس جداگانه پر بشه و به DbContext اضافه بشه. بعدا هم به راحتی میتونید برنامه رو توسعه بدید .

حجم اطلاعاتی به شدت زیاد میشه دیگه
و اینکه دستوراتی که قبلاً میشد براحتی بگیم فیلدهایی که Null هستن رو برگردون دیگه نمیشه بگیم

Mojtaba.Shateri
یک شنبه 24 فروردین 1393, 12:07 عصر
حجم اطلاعاتی به شدت زیاد میشه دیگه
و اینکه دستوراتی که قبلاً میشد براحتی بگیم فیلدهایی که Null هستن رو برگردون دیگه نمیشه بگیم

خب اگه حجم دیتابیستون زیاده دقیقا درست میگید.
یه راه دیگه اینکه شما همه Annotation ها به جز Key رو ازش بردارید. بعد به ازای هر View یک کلاس ViewModel بنویسید و Annotation هارو براش قرار بدید و در متد Action محتوای ViewModel همون View رو دریافت کنید و در کلاس اصلی بریزید و پاس بدید به Dbcontext. دیگه مشکلیم پیش نمیاد.
فقط این روش مناسب نیست و امن هم نیست.

mehdin69
یک شنبه 24 فروردین 1393, 12:31 عصر
خب اگه حجم دیتابیستون زیاده دقیقا درست میگید.
یه راه دیگه اینکه شما همه Annotation ها به جز Key رو ازش بردارید. بعد به ازای هر View یک کلاس ViewModel بنویسید و در متد Action محتوای ViewModel همون View رو دریافت کنید و در کلاس اصلی بریزید و پاس بدید به Dbcontext. دیگه مشکلیم پیش نمیاد.
فقط این روش مناسب نیست و امن هم نیست.
نیاز شدید دارم به Annotation هایی که هستند
مطمئناً راه حلی وجود داره که بعضی از Annotation ها رو یه طوری بشه صدا زد یا یک مدلی بشه غیر فعالشون کرد

Mojtaba.Shateri
یک شنبه 24 فروردین 1393, 12:45 عصر
نیاز شدید دارم به Annotation هایی که هستند
مطمئناً راه حلی وجود داره که بعضی از Annotation ها رو یه طوری بشه صدا زد یا یک مدلی بشه غیر فعالشون کرد

شما فرض کن فیلد A و B هردوشون اجباری هستند. جدول هم ساخته میشه در دیتابیس .
حالا در View1 فقط فیلد A کلاس رو پر کنیم ، اگه به فرض Annotation هم باشه که بگه فیلد B رو null کن. شما با جدول ساخته شده چیکار می کنی؟! دوباره میسازیش؟! نوع فیلدهاشو تغییر میدی؟!

بهزاد علی محمدزاده
یک شنبه 24 فروردین 1393, 15:41 عصر
سلام . مدل متناظر با بانک و به View ارسال نکن . برای هرکدام از اونها یه viewmodel ایجاد کن و Annotation رو به اونها نسبت بده . و مدل اصلی رو بذار null پذیر باشه .

mehdin69
یک شنبه 24 فروردین 1393, 17:01 عصر
سلام . مدل متناظر با بانک و به View ارسال نکن . برای هرکدام از اونها یه viewmodel ایجاد کن و Annotation رو به اونها نسبت بده . و مدل اصلی رو بذار null پذیر باشه .

میشه یه مثال یا یه لینک که اینطوری کار کرده باشه رو بذارید؟

بهزاد علی محمدزاده
یک شنبه 24 فروردین 1393, 18:30 عصر
تقریبا به این صورت در میاد : ( اگر مطابق سوالت نبود , کد بذار تا روی اون توضیح بدیم )


public class Entity {
public Nullable<string> A { get; set; }
public Nullable<string> B { get; set; }
public Nullable<string> C { get; set; }
public Nullable<string> D { get; set; }
public Nullable<string> E{ get; set; }
public Nullable<string> F { get; set; }
}


و اگر لایه بندی نداری توی همون پروژه اصلی یه پوشه ایجاد کن : ViewModels


public class ViewModelAE {
[Required]
public string A { get; set; }
[Required]
public string E { get; set; }


/*...*/
}

برای هر کدام از View ها یه ViewModel ایجاد کن تا اطلاعاتی که لازم هست و ارسال کنی .

توی کنترلر هم با همین ViewModel کار کن :


public ActionResult CreateAE(ViewModelAE vmAE) {
if(ModelState.IsValid)
{
// Operation
}
return View();
}

با این کار برای هر View قوانین خودش و توی ViewModel اعمال می کنی . و بعد می تونی از مدل متناظر با بانک یه نمونه ایجاد کنی و داده های ViewModel و توی اون قرار بدی و به هر روشی که با دیتابیس کار می کنی مدل و ذخیره کنی .

این یه راه حل هست و بهتره که کار با viewmodel و یادبگیری . اما اگر شما نمی خوای مدل متناظر با بانک nullabale باشه . یعنی مثال Entity که من همه رو null گذاشتم . اگر نمی خوای اینجوری باشه و فیلد ها رو همونجا Required می کنی . این راه دیگه ایی نداره یا حداقل من نمی دونم به جز اینکه Default براش بذاری .

چون دیتابیس شما دیگه null نمی پذیره . اگر هم مثل روش بالا می خوای همه null بذاری اما در سطح برنامه بعضی ها رو در یه View می خوای اجباری کنی و بعضی ها رو در یه View دیگه . کدهای بالا راه حلش هست .

مهدی کرامتی
دوشنبه 25 فروردین 1393, 18:18 عصر
وقتی یک یا چند فیلد صفت [Required] داشته باشه در کنترلر وقتی دستور if(ModelState.IsValid) ارزیابی میشه مقدار false خواهد داشت و پیام فوق را می بینید. راه حل: فیلدهایی که در View نیاورده اید را قبل از دستور فوق به صورت دستی مقدار دهی کنید.