View Full Version : مبتدی: مشکل در ذخیره سازی در دیتابیس
arash ghafori
چهارشنبه 06 آذر 1392, 17:13 عصر
با سلام.
من 4 جدول به این شکل دارم.
113280
حالا یک کنترولر به نام Home اضافه میکنم که شامل Create , Delete , Edit ,... هست و با Entity کار میکنه.
و User_table رو به عنوان مدل پاس میدم به View.
بعد میرم داخل View ی Create و مشکل من دقیقا اینجاست که به همه ی فیلد های جدول ها دسترسی دارم به جز فیلد های جدول Days_table....!
و تلاش میکنم به این صورت بهش دستری پیدا کنم :
@Html.LabelFor(model => model.Doctor_Table.Days_Table.Single(rooz=>rooz.Rooz))
اما زیر rooz.Rooz خط قرمز میکشه و این ارور رو میده :
'cannot implicitly convert type 'string' to 'bool
اگر کسی بتونه راهنماییم کنه ممنوم میشم.
اگر هم کدی چیزی لازم هست بگید میزارم.
تشکر.
hakim22
چهارشنبه 06 آذر 1392, 17:58 عصر
تا جایی که من میدونم دستور زیر
Single(rooz=>rooz.Ro oz)
نیاز به یک شرط داره ، مثلا rooz.Rooz==10
یا باید از First استفاده کنید و فقط مقدار اول رو برگردونید.
arash ghafori
چهارشنبه 06 آذر 1392, 18:07 عصر
ممنون از پاسختون.
منظورتون اینه که اینطوری بنویسم ؟
@Html.LabelFor(model => model.Doctor_Table.Days_Table.First(rooz=>rooz.Rooz))
اما این هم زیر rooz.Rooz خط قرمز میکشه و همون ارور رو میده :
'cannot implicitly convert type 'string' to 'bool
hakim22
چهارشنبه 06 آذر 1392, 22:28 عصر
@Html.LabelFor(model => model.Doctor_Table.Days_Table.First(rooz=>rooz.Rooz==shart))
arash ghafori
چهارشنبه 06 آذر 1392, 23:06 عصر
باز هم سپاس از پاسختون.
اما مشکل من دسترسی نداشتن به فیلد های جدول days_table هست.
من نمیخوام شرطی بزارم.
این کد ها برای اضافه کردن است! نه برای نمایش دادن !
من چطوری میتونم به فیلد های جدول روزها دسترسی پیدا کنم؟
ممنون میشم اگه کمکم کنید
R_Rajaee_Rad
پنج شنبه 07 آذر 1392, 05:28 صبح
چرا از در کنترلر join استفاده نکردی؟
در ضمن روابط جدولتو یکم توضیح بده
aghayex
پنج شنبه 07 آذر 1392, 07:30 صبح
دوست عزیز یه سمپل بزار
در مورد مشکلتون من چون تازه وارد این تالار شدم نمی تونم دقیق راهنماییتون کنم . اما باتوجه به اینکه مدتی با ان تی تی کار کردم چیزهایی رو می گم یا مشکل مرتفع شد .
شما یه مدل دارید که شامل 4 کلاس هست که به هم مرتبط شدند ( یعنی یه دیتابیس با چهار تیبل ) حالا برا اضافه کردن یه رکورد در هر یک از تیبل ها باید یه شی از اون کلاس (days_table) بسازی بعد مقادیرشو پر کنی و بعد از اون مثل model.days_table.add(days_table_1); و بعد متد savechang(); مدل رو فراخوانی می کنی
hakim22
پنج شنبه 07 آذر 1392, 10:19 صبح
سوالی که مطرح کرده اید نه آغازی دارد و نه پایانی و هیچ ربطی هم به افزودن یک مقدار جدید به بانک اطلاعاتی ندارد.
در اینجا چند سوال پیش میاد :
1- آیا میدانید کاربرد دستور LabelFor برای چیست ؟
2- آیا میدانید با دستور Html.BeginForm آشنایی دارید ؟
3- آیا با مفهوم مدل و نحوه ی بکارگیری آن در MVC آشنایی دارید ؟
arash ghafori
پنج شنبه 07 آذر 1392, 10:20 صبح
چرا از در کنترلر join استفاده نکردی؟
در ضمن روابط جدولتو یکم توضیح بده
اگر من بخوام از Join استفاده کنم باید به جای جدول User_table کلاسی رو که شامل Set; get هر فیلد هست رو به عنوان مدل بفرستم. یعنی این کلاس :
public class ArticleViewModel
{
public int UserCode_UserTable { get; set; }
public int? UserID_UserTable { get; set; }
public string Name { get; set; }
public string Family { get; set; }
public string Tell { get; set; }
public int CodeDoctor_DoctorTable { get; set; }
public string Takhasos { get; set; }
public string Persent { get; set; }
public int? UserCode_daysTable { get; set; }
public string Rooz_daysTable { get; set; }
public string Saat_daysTable { get; set; }
public string Tarikh_daysTable { get; set; }
}
و توی Viewی Create به این حالت ازش مدل بسازم :
@model IEnumerable<Dental_Clinic.Controllers.ArticleViewModel>
خوب تا اینجا مشکلی نیست!
اما مشکل اینجاست که Action Create یه پارامتر از نوع User_Table user_table داره ! یعنی user_table میگیره ! ولی من درارم بهش فیلد های یه کلاس رو میفرستم ! Action Create من هم به این حالته :
[HttpPost]
public ActionResult Create(User_Table user_table)
{
if (ModelState.IsValid)
{
db.User_Table.Add(user_table);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.User_code = new SelectList(db.Doctor_Table, "Code_Doctor", "Takhasos", user_table.User_code);
ViewBag.User_ID = new SelectList(db.User_Type_Table, "User_ID", "User_Type", user_table.User_ID);
return View(user_table);
}
و در نتیجه عملیات Save انجام نمیشه !
نمیدونم باید چی کار کنم !
راجع به روابط جدول هم به این حالت است که جدول User-type-table میگه نوع کاربر چیه ! مثلا : User_Id = 1 و User_type = پزشک
توی جدول User_Table درواقع فیلد User_Id با جدول User-type-table ارتباط 1 به چند داره. و User_code هم که با code_doctor از جدول Doctor_table ارتباط داره.
و در آخر جدول Doctor_table از طریق فیلد code_doctor با user_code جدول Days_table ارتباط داره که میگه هر دکتر میتونه چه روز هایی بیاد.
ممنون میشم راهنماییم کنید.
arash ghafori
پنج شنبه 07 آذر 1392, 10:32 صبح
سوالی که مطرح کرده اید نه آغازی دارد و نه پایانی و هیچ ربطی هم به افزودن یک مقدار جدید به بانک اطلاعاتی ندارد.
در اینجا چند سوال پیش میاد :
1- آیا میدانید کاربرد دستور LabelFor برای چیست ؟
2- آیا میدانید با دستور Html.BeginForm آشنایی دارید ؟
3- آیا با مفهوم مدل و نحوه ی بکارگیری آن در MVC آشنایی دارید ؟
دوست عزیز من از LabelFor به عنوان مثال استفاده کردم.
در واقع کد های مربوط به بخش View ی صفحه ی Create من برای اضافه کردن به این شکله :
@model Dental_Clinic.User_Table
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset>
<legend>اضافه کردن دکتر</legend>
<div class="editor-label">
کد دکتر
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Doctor_Table.Code_Doctor)
@Html.ValidationMessageFor(model => model.Doctor_Table.Code_Doctor)
</div>
<div class="editor-label">
تخصص
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Doctor_Table.Takhasos)
@Html.ValidationMessageFor(model => model.Doctor_Table.Takhasos)
</div>
<div class="editor-label">
حقوق
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Doctor_Table.Dr_Percent)
@Html.ValidationMessageFor(model => model.Doctor_Table.Dr_Percent)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.User_ID, "User_Type_Table")
</div>
<div class="editor-field">
@Html.DropDownList("User_ID", String.Empty)
@Html.ValidationMessageFor(model => model.User_ID)
</div>
<div class="editor-label">
نام
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
<div class="editor-label">
نام خانوادگی
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Family)
@Html.ValidationMessageFor(model => model.Family)
</div>
<div class="editor-label">
شماره ی تماس
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Tell)
@Html.ValidationMessageFor(model => model.Tell)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
و در واقع مشکل من اینجاست که وقتی میزنم :
<div class="editor-label">
روز
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Doctor_Table.Days_Table.
@Html.ValidationMessageFor(model => model.Doctor_Table.Days_Table.
</div>
وقتی میزنم Doctor_table.Days_table دات ، فیلد های مربوط به جدول Days_table رو نمیاره...!
مشکل من اینه که چطوری میتونم به فیلد های جدول days_table دسترسی پیدا کنم.
hakim22
پنج شنبه 07 آذر 1392, 11:43 صبح
روش اول شما درست بود ولی شما باید تک تک property های ArticleViewModel رو به user_table کپی میکردید و سپس اون رو Save میکردید.
در روش دوم شما انتظار دارید که مدل که به View ارسال میشه دارای همه ی زیر شاخه هاش باشه. متاسفانه اینطور نیست. در حقیقت فقط تا یک محله از کلاسها کیپی میشوند.
میتوانید با دستور EditorForModel این مسئله رو بررسی کنید.
شاید با یک کلاس واسط در اینجا مشکل شما حل شود.
@{
var days=model.Doctor_Table.Days_Table;
}
کلا این روشی نیست که باید استفاده کنید و ساختن یک ViewModel مجزا و کیپی فیلدها روش خیلی بهتریه. اصولا ویو نباید دارای هیچ دستور محاسبه ای و یا Query یا هر نوع از دستورات LINQ باشه و همه این کارها را باید در سمت Controller انجام بدید. در غیر این صورت شما قانون اساسی MVC رو نقض میکنید.
arash ghafori
پنج شنبه 07 آذر 1392, 12:27 عصر
[QUOTE=hakim22;1921676]روش اول شما درست بود ولی شما باید تک تک property های ArticleViewModel رو به user_table کپی میکردید و سپس اون رو Save میکردید.
حرف شما کاملا درسته.
اما اگر من از این راه برم باید توی View از ArticleViewModel به عنوان مدل استفاده کنم ! و طبیعتا کد های صفحه ی View که توی بالا نوشته بودم این شکلی میشه :
@model IEnumerable<Dental_Clinic.Controllers.ArticleViewModel>
@{
Layout = "~/_LayoutPage.cshtml";
Dental_Clinic.Controllers.ArticleViewModel art = new Dental_Clinic.Controllers.ArticleViewModel();
var item = art;
}
// به همه ی فیلد هام باید از طریق آیتم دسترسی پیدا کنم
<div class="editor-label">
روز
</div>
<div class="editor-field">
@Html.EditorFor(model => item.Rooz_daysTable);
@Html.ValidationMessageFor(model => item.Rooz_daysTable);
</div>
// و همینطور تا به آخر همه رو مقدار دهی کنم
تا اینجا درست هست ! هیچ مشکلی هم نیست !
اما بعدش چطوری تابع Add رو توی کنترولر پیاده سازی کنم !
به کد زیر دقت کنید : چی جای علامت سوال ها بزارم؟
[HttpPost]
public ActionResult Create(؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ )
{
if (ModelState.IsValid)
{
db.User_Table.Add(؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟؟؟؟);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.User_code = new SelectList(db.Doctor_Table, "Code_Doctor", "Takhasos", user_table.User_code);
ViewBag.User_ID = new SelectList(db.User_Type_Table, "User_ID", "User_Type", user_table.User_ID);
return View(user_table);
}
با تشکر فراوان.
karimi5555
پنج شنبه 07 آذر 1392, 13:18 عصر
از اون جایی که کلاسها تا یک مرحله کپی میشن میتونید این کارو بکنید.
خوب از اون جایی که جدول روزها مربوط به کاربر میشه شما میتونید یه فیلد به جدول User_table اضافه کنید که Allow null هم هست.
بعد جدول Days_table رو به این فیلد وصل کنید.
موقع ثبت کاربر هم باید چک کنید که آیا کابری که ثبت می کنید پزشکه یا نوع دیگه داره.
اگه پزشک بود ثبت کننده رو مجبور می کنید که این فیلد رو پر کنه اگه پزشک نبود این فیلد رو حذف یا غیر فعال میکنید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.