PDA

View Full Version : حرفه ای: ساخت بانک از روی Model برنامه



امید خطیبی
دوشنبه 30 دی 1392, 20:01 عصر
با سلام خدمت دوستان عزیز و گرامی
دوستان من می خواستم بدونم راهی وجود داره بعد از این که Model برنامه را ساختیم بیایم از روی Model یک بانک بسازیم
البته اگر بشه کلاس ها رو داخل Ado.net Entity Framework بگذاریم و خود Enitity Faramework بیاد و برای ما با استفاده از Entity هایی که توسط کلاس ما ساخته شده یک بانک بسازه

من که هر کاری کردم که کلاس هام رو بندازم داخل Entity Framework نتونستم و جایی هم پیدا نکردم که همچون کاری رو کرده باشه که اول کلاس رو بسازه و بیاد دیتابیس را از روی کلاس ها یا همان Models برنامه بانک رو بسازه

لطفا کمک کنید ممنون

i.lover3000
سه شنبه 01 بهمن 1392, 00:13 صبح
سلام کاری که شما میخواین انجام بدین رو میگن Entity Framework Code First. اگه سرچ کنی پیدا میکنی تقریبا بیشترین طرفدار رو داره این روش.

aghayex
سه شنبه 01 بهمن 1392, 07:21 صبح
یه مثال کوچیک میزنم :
یه کلاس درست می کنی که حتما باید یه پروپرتی از نوع اینت و نامش هم Id باشه و attributes [Key] هم بالای سرش باشه مابقی پروپرتی هات رو که دوست داری رو وارد می کنی . این کلاس به مساوی با تیبلی هست که در دیتابیست تشکیل میشه و پروپرتی هات هم مساوی با ستون های اون تیبل هست .

Public Class person
{
[Key]
Public int Id{get;set;}

Public string Name{get;set;}
}

چند نکته :
اگه در کلاس بالا شما یه متغیر تعریف کنی که از نوع Private باشه اون متغیر تبدیل به ستون نمیشه . ( مهدی فرزاد )
اگه در کلاس بالا شما جلوی یه متغیر عبارت {get;set;} رو نذاری اون متغیر تبدیل به ستون نمیشه .( مهدی فرزاد )
اگه در تیبلت خواستی یه ستون کلید داشته باشی که خودش اتوماتیک عدد بندازه فقط کافی هست بالای اون متغیر عبارت [Key] رو بزنی و اگه خواستی یه ستون داشته باشی که کلید باشه اما خودت مقدار دهیش کنی باید به صورت [Key,DatabaseGenerated(DatabaseGeneratedOption.None )]
اگه خواستی در یه ستون عددی اون ستون نال پذیر باشه میای نوعش رو به صورت int? یا byte? یا bool? در نظر می گیری و اگه خواستی خلاف این باشه علامت سوال رو از جلوی نوع متغیر برمیداری
اگه خواستی یه متغیر استرینگ نال پذیر نباشه از اتریبیوت [Required] استفاده می کنی و اگه هیچی نذاری خود اون ستون استرینگ نال پذیر میشه
اگه خواستی محدودیت برای تعداد کاراکترهای ستون رشته اعمال کنی باید از اتریبیوت [MaxLength(10)] استفاده کنی
اگه خواستی نوع ستونت که در مدل استرینگ هست در دیتابیس text باشه باید از اتریبیوت [Column(TypeName="ntext")] استفاده کنی
اگه خواستی در تیبلت چند تا ستون کلید داشته باشی باید به جای اتریبیوت [Key] از [Key,Column(Order=1)] برای ستون اول و برای کلید دون اون عدد یک که جلوی Order هست رو به دو و برای سومی سه تا هر چی خودت بخواهی

برای تعریف دیتا بیس هم به صورت زیر عمل می کنی :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.ComponentModel.DataAnnotations;

namespace WpfApplication1
{
class DbTest:DbContext
{
public DbSet<person> persons { get; set; }
}
}

نکته ای که اینجا هست اینه که ما گفتیم یه تیبل برای ما بساز با نام persons از کلاس person که این دو فرقشون از لحاظ لغوی یه s هست و اگه شما نذاری خودش اتوماتیک موقعی که دیتابیس رو وارد می کنه یه s جلوش میندازه.

حالا میمونه کانکشن استرینگ . در فایل app.config میای به این صورت عمل می کنی :



<configuration>

<connectionStrings>
<clear />
<add name="DbTest" connectionString="Data Source=(local);Initial Catalog=DbTest;Integrated Security = true" providerName="System.Data.SqlClient" />
</connectionStrings>

</configuration>

حالا کافیه یه شی از DbTest در فرم هات بسازی و یه دستور به سمت تیبلت اعمال کنی خودش اتوماتیک دیتابیستو میسازه

Boy_nn
سه شنبه 01 بهمن 1392, 08:37 صبح
برای اطلاعات بیشتر به این لینک مراجعه کن
http://www.dotnettips.info/post/831/ef-code-first-1

امید خطیبی
سه شنبه 01 بهمن 1392, 23:04 عصر
با سلام خدمت دوستان و برنامه نویسانی که به من کمک کردند
با تشکر از دوستان عزیز
خیلی ممنون از این که به من جواب می دهید
دوستان من به این سایت رفته ام و خیلی از سوالات خودم را آنجا مطرح کرده ام
اما یک سوال هم اینجا داشتم و داخل برنامه های آن ها من نفهمیدم
یکی از نمونه برنامه های سایت را که دانلود کرده بودم دیدم زمانی که می خواهند مقادیری را داخل یک جدول ذخیره بکنند یا ویرایش بکنند از یک Framework استفاده کرده اند که داخل فایل edmx.* و داخل فایل Designer.cs.* هست اما من می خواهم بدونم ما نمی تونیم به جای این این کار از دستورات به صورت مستقیم استفاده کنیم
و یک موضوع دیگه که من داخل یک فیلم آموزشی دیده بودم که به این صورت استفاده کرده که زمانی که من این کار را انجام می دهم هنگام کامپایل به من پیغام خطا می دهد می توانید راهنمایی کنید که من باید این تکه کد زیر رو چگونه تغییر بدهم که بتونم اطلاعات را داخل DB ذخیره کنم
اول آمده یک نمونه از Entity ساخته به این صورت :


EntitiesBaskoolEmadSandArdakan DBTablesBaskool = new EntitiesBaskoolEmadSandArdakan();


بعد از آن با استفاده از ساختن یک نمونه از Table و فیلدها و اطلاعات را از تکست باکس ها می گیرد و داخل فیلد ها قرار می دهد
در این روش من یک مشکل دارم که زمانی که یک نمونه از Database ساخته است در فیلم که نام Database را استفاده کرده و یک نمونه از آن ساخته است
که من این کار را نمی توانم انجام بدهم که از دستور SaveChange استفاده کنم
و یک چیز دیگر من برای این که بتوانم روی پردازش اطلاعاتم داخل برنامه استفاده کنم کلاس هایی رو ساختم که فیلد های آن با فیلد های دیتابیسم هم خوانی ندارد ولی اطلاعات را به نحوی در بانک ذخیره می کنم می خواستم بدانم که من چطوری می توانم با استفاده از فیلد هایی که در مدل برنامه ساخته ام و مقادیر داخل فرمم و Database خودم رابطه ای برقرار کنم و اطلاعات را داخل Database ذخیره کنم
اگر می شود این را به صورت یک نمونه کد به من بدهید.
چون من هر کار که انجام می می دهم یا بانک من را توسط کد نویسی دستی داخل VS2013 نمی شناسه یا این که کد های قبلی که در فیلم های آموزشی می بینم و یا داخل کد های دیگر برای من کار نمی کند
نام دیتابیس من Baskool.Emad هست
نام جدولی که می خواهم اطلاعات در آن ذخیره شود TUsers می باشد
نام کلاسی که می خواهم به عنوان Model از آن استفاده کنم UserClass می باشد و کد آن در زیر آمده:


public class UserClass : INotifyPropertyChanged

{

#region Fields

private int _CodeUser;

private string _FullNameUser;

private string _Password;

#endregion Fields

#region Properties

public int CodeUser

{

set { _CodeUser = value;

if (PropertyChanged == null) return;

OnPropertyChanged("CodeUser");

}

get { return _CodeUser; }

}

public string FullNameUser

{

set

{

_FullNameUser = value;

if (PropertyChanged == null) return;

OnPropertyChanged("NameUser");

}

get { return _FullNameUser; }

}

public string Password

{

set

{

_Password = value;

if (PropertyChanged == null) return;

OnPropertyChanged("Password");

}

get { return _Password; }

}

#endregion Properties

#region Delegates and Events

public event PropertyChangedEventHandler PropertyChanged;

#endregion Delegates and Events

#region Methods

private void OnPropertyChanged(string PropertyName)

{

if (PropertyChanged == null) return;

PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));

}

#endregion Methods

}


و برای AddUser به این صورت عمل کرده ام که همان قسمتی که به شما گفتم در برنامه نمی شناسد و نمی دانم چی کار باید انجام بدهم:



UsersWindow UserWindow = new UsersWindow();

if (UserWindow.TextIdUser == null)

{

System.Windows.MessageBox.Show("لطفا شماره شناسایی را وارد کنید!");

}

else

{

UserClass user = new UserClass { CodeUser=int.Parse(UserWindow.TextIdUser.Text) };

}

if (UserWindow.TextNameUser.Text == null || UserWindow.TextFamilyUser.Text==null)

{

System.Windows.MessageBox.Show("لطفا نام یا نام خانوادگی خود را وارد کنید!");

}

else

{

UserClass user = new UserClass { FullNameUser = UserWindow.TextNameUser.Text + " " + UserWindow.TextFamilyUser.Text };

}

if (UserWindow.TextPasswordUser.Text == null)

{

System.Windows.MessageBox.Show("لطفا پسورد را وارد کنید!");

}

else

{

UserClass user = new UserClass { user.Password = UserWindow.TextPasswordUser.Text };

}

TUser TableUser = new TUser();

TableUser.IdUser = users.CodeUser;

TableUser.NameUser = users.FullNameUser;

TableUser.Password = users.Password;



در ضمن به این خط کد آخر هم به هنگام کامپایل وارنینگ می گیرد


UserClass user = new UserClass { user.Password = UserWindow.TextPasswordUser.Text };

و این خط


UserClass user = new UserClass { CodeUser=int.Parse(UserWindow.TextIdUser.Text) };

لطفا کمک کنید که بتوانم حداقل یک جدول را اطلاعات داخل آن بریزم و ادامه راه ساده هست و کاری ندارد
خیلی ممنون دوستان.