# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > مقالات مرتبط با Microsoft .Net Framework > آموزش: آموزش استفاده از Entity Framework  در معماری 3 لایه - همراه با مثال عملی

## mohsen_f_b

باسلام و عرض ادب خدمت تمام دوستان عزیز و گرامی خودم در سایت بزرگ برنامه نویسان ایران زمین.
بنده چند وقتی هستش که از ADO.NET سوئیچ کردم به برنامه نویسی به سبک Entity Framework که این مدیون جناب آقای کرامتی و کلاس های خوب ایشان هستم.
چند روزی بود که می خواستم از Entity Freamwork  در معماری لایه ای استفاده کنم.
همه جا خوندم که Entity Framework قسمت Data Access Layer  رو در بر میگیره.شروع کردم به جستجو و کسب اطلاعات تا اینکه توانستم اینکار رو انجام بدم.
شاید خنده تون بگیره که این کاره ساده چیه که من دارم در موردش تاپیک میزنم.اینو که همه بلدن.
من این آموزش رو میزارم برای کسایی که تازه وارد هستن و دنبال یک منبع فارسی برای این نوع برنامه نویسی هستن.
یکی از استادهای دانشگاهم همیشه می گفت راه رسیدن به خدا زیاده، منم اینجا از این جمله استادم استفاده می کنم و می گم راه و روش برنامه نویسی معماری لایه ای بهمراه Entity Framework زیاده و منم یک راهشو که شاید بدترین نوع باشه رو اینجا می گم تا یک سرنخ برای شروع و رسیدن به نحوه دیگه کدنویسی در این زمینه برای خودم و دوستان باشد.
به امید اینکه این آموزش مورد توجه دوستان واقع شود.
از دوستان دیگر که تجربه بسیار بالاتری در این زمینه دارن خواهش می کنم که روشهای دیگه ای که استفاده می کنن به ما هم یاد بدن.
توجه داشته باشید در آخر سورس برنامه بهمراه فایل آموزشی برای دانلود قرار داده می شود.
ببخشید که پرحرفی کردم.
بریم و شروع کنم.

برنامه تحت وب نوشته می شود
زبان برنامه نویسی : C#‎‎‎‎‎
بانک اطلاعاتی : SQL Server

فایل پروژه اضافه شد.

 قدم اول : سناریو
خوب دوستان شروع کنیم. میخواهیم بک برنامه بنویسیم که نام، نام خانوادگی بهمراه شماره تلفن همراه شخص رو بگیریم و در دیتابیس ذخیره کنیم.
بتونیم با تکنولوژی های معماری لایه و Entity Framework هر 4 عمل اصلی یعنی اضافه کردن، ویرایش کردن، حذف کردن و نمایش را اجرا کنیم.
نکته : از Entity Framework – Database First  استفاده می کنیم.

قدم دوم : ساخت پایگاه داده
یک پایگاه داده با نام Person ایجاد کنید.
در این پایگاه داده یک جدول با نام Contact با اجزای زیر بسازین.



اینم از دیتابیس

قدم سوم : ساخت Stored Procedures مورد نیاز
ما برای همه عملیات ها از  Stored Procedures استفاده می کنیم.
خوب نیاز به 5 تا Stored Procedures برای این برنامه داریم.
1-    Contact_SelectAll که یک resultset حاوی تمامی رکوردهای جدول Contact را برای ما برمیگرداند.

CREATE PROCEDURE Contact_SelectAll 

AS

    SET NOCOUNT ON

    SELECT ID,Name,Family,Mobile,InsertDate,UpdateDate

      FROM Contact

    RETURN



2-    Contact_SelectById که یک resultset حاوی رکورد مورد نظر ما از جدول Contact برمیگرداند.

CREATE PROCEDURE Contact_SelectById
    @ID int 
AS
    SET NOCOUNT ON
 
    SELECT ID,Name,Family,Mobile,InsertDate,UpdateDate
      FROM Contact
      Where ID = @ID
 
    RETURN


3-    Contact_Insert برای انجام عملیات Insert که یک resultset برابر ID رکورد ثبت شده برای ما برمیگرداند


CREATE PROCEDURE Contact_Insert
    @Name        nVarchar(50),
    @Family    nVarchar(50),
    @Mobile    nVarchar(16),
    @InsertDate    Datetime,
    @UpdateDate    Datetime
AS    
    Insert Into Contact
                (Name,Family,Mobile,InsertDate,UpdateDate)
            Values
                (@Name,@Family,@Mobile,@InsertDate,@Updatedate)
            
    SELECT CAST(SCOPE_IDENTITY() AS INT) AS Id

4-    Contact_Update برای انجام عملیات ویرایش استفاده میشود


CREATE PROCEDURE Contact_Update
    @ID            int,
    @Name        nVarchar(50),
    @Family        nVarchar(50),
    @Mobile        nVarchar(16),
    @InsertDate    Datetime
AS    
    SET NOCOUNT ON
    
    Update Contact
            Set Name = @Name,
                Family=@Family,
                Mobile=@Mobile,
                InsertDate=@InsertDate
            Where
                ID = @ID
        RETURN

5-    Contact_Delete برای حذف رکورد مورد نظر


CREATE PROCEDURE Contact_Delete
    @ID            int
AS    
    SET NOCOUNT ON
        Delete Contact
            Where
                ID = @ID
        RETURN
        
خوب عزیزان اینم از Stored Procedures های مورد نیاز



قدم چهارم : ساخت لایه Data Access Layer 1-    
1-    باز کردن Visual Studio 2010
  2-    ایجاد یک پروژه جدید از نوع Class Library project با زبان C#‎‎‎‎‎‎‎‎ به نام PersonDAL
3-    توجه داشته باشید Solution Name را بروی Person  تغییر نام دهید.




4-    حالا بروی نام Project کلیک راست کنید، Add  و بعدش New Item 



5-    انتخاب ADO.NET Entity Data Model و اسمش رو برابر با PersonDataModel قرار دهید

6-    Generate from database رو انتخاب کنید و بروی Next  کلیک کنید


7-    پایگاه داده خود را انتخاب کنید

8-    انتخاب Table و Stored Procedures های طراحی شده و کلیک بر روی Finishe


9-    تا اینجا مدل مدنظر خودتون رو به پروژه اضافه کردین حالا یک کلاس به نام CantactData.cs به پروژه اضافه کنید.



10-    حالا کلاس را باز کنید و در بدنه اصلی کلاس 

class ContactData
را به 
public static class ContactData
تغییر دهید.


11-    حالا باید Stored Procedures را بعنوان یک Function به Entity Framework  بشناسانیم.
برای اینکار بر روی PersonDataModel.edmx کلیک کنید تا صفحه مربوطه باز شود.


بروی Contact کلیک راست کرده و Add بعد Funcation Import… کلیک کرده

صفحه باز شده به شکل زیر میباشد

از Combo Box مربوط به Stored Procedure Name اسم Cantact_ Delete  رو انتخاب کنید و گزینه None رو انتخاب کنید و نام Function  را وارد کنید

دوباره به مرحله Function Import بروید تا  Function بعدی را Add کنیم
خوب به Add کردن Function ثبت اطلاعات جدید Insert دقت کنید.
به دلیل اینکه بعد از ثبت اطلاعات ID رکورد جدید را برمیگرداند به شکل زیر تعریف می شود.


برای 2 Stored Procedure مربوط به نمایش اطلاعات Cantact_SelectAll و Cantact_SelectById به عکس هر 2 توجه فرمایید.
اول به صفحه Function Import رفته و مانند عکس ها زیر عمل کنید



و برای Stored Procedure ویرایش اطلاعات Contact_Update به صفحه Function Import  رفته و تنظیمات مانند عکس را انجام دهید


خوب حالا تمام Function های مورد نیاز آماده شد.
12-    حالا به کلاسی که ساخته ایم میرویم و عملیات های مورد نیاز رو برای Function ها تعریف میکنیم.
کدها به شکل زیر میباشد.

        #region Insert
        public static int Insert(string name, string family, string mobile, DateTime insertDate)
        {
            using (PersonEntities db = new PersonEntities())
            {
                return Insert(db, name, family, mobile, insertDate);
            }
        }
        public static int Insert(PersonEntities db, string name, string family, string mobile, DateTime insertDate)
        {
            return db.Cantact_Insert(name, family, mobile, insertDate, insertDate).ElementAt(0).Value;
        }
        #endregion


        #region Update
        public static void Update(int id, string name, string family, string mobile, DateTime updateDate)
        {
            using (PersonEntities db = new PersonEntities())
            {
                Update(db, id, name, family, mobile, updateDate);
            }
        }
        public static void Update(PersonEntities db, int id, string name,
                                  string family, string mobile, DateTime updateDate)
        {
            db.Contact_Update(id, name, family, mobile, updateDate);
        }
        #endregion

        #region Delete
        public static void Delete(int id)
        {
            using (PersonEntities db = new PersonEntities())
            {
                Delete(db, id);
            }
        }
        public static void Delete(PersonEntities db, int id)
        {
            db.Contact_Delete(id);
        }
        #endregion

        #region SelectById
        public static Contact SelectById(int id)
        {
            using (PersonEntities db = new PersonEntities())
            {
                return SelectById(db, id);
            }
        }
        public static Contact SelectById(PersonEntities db, int id)
        {
            return db.Contact_SelectById(id).ElementAtOrDefault(0);
        }
        #endregion

        #region Select
        public static List<Contact> SelectAll()
        {
            using (PersonEntities db = new PersonEntities())
            {
                return SelectAll(db);
            }
        }
        public static List<Contact> SelectAll(PersonEntities db)
        {
            return db.Contact_SelectAll().ToList();
        }
        #endregion


 


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PersonDAL
{
    public static class ContactData
    {
        #region Insert
        public static int Insert(string name, string family, string mobile, DateTime insertDate)
        {
            using (PersonEntities db = new PersonEntities())
            {
                return Insert(db, name, family, mobile, insertDate);
            }
        }
        public static int Insert(PersonEntities db, string name, string family, string mobile, DateTime insertDate)
        {
            return db.Cantact_Insert(name, family, mobile, insertDate, insertDate).ElementAt(0).Value;
        }
        #endregion

        #region Update
        public static void Update(int id, string name, string family, string mobile, DateTime updateDate)
        {
            using (PersonEntities db = new PersonEntities())
            {
                Update(db, id, name, family, mobile, updateDate);
            }
        }
        public static void Update(PersonEntities db, int id, string name,
                                  string family, string mobile, DateTime updateDate)
        {
            db.Contact_Update(id, name, family, mobile, updateDate);
        }
        #endregion

        #region Delete
        public static void Delete(int id)
        {
            using (PersonEntities db = new PersonEntities())
            {
                Delete(db, id);
            }
        }
        public static void Delete(PersonEntities db, int id)
        {
            db.Contact_Delete(id);
        }
        #endregion

        #region SelectById
        public static Contact SelectById(int id)
        {
            using (PersonEntities db = new PersonEntities())
            {
                return SelectById(db, id);
            }
        }
        public static Contact SelectById(PersonEntities db, int id)
        {
            return db.Contact_SelectById(id).ElementAtOrDefault(0);
        }
        #endregion

        #region Select
        public static List<Contact> SelectAll()
        {
            using (PersonEntities db = new PersonEntities())
            {
                return SelectAll(db);
            }
        }
        public static List<Contact> SelectAll(PersonEntities db)
        {
            return db.Contact_SelectAll().ToList();
        }
        #endregion
    }
}


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

باتشکر از تمامی دوستان
به امید موفقیت ایران و ایرانی

ادامه دارد ...

----------


## mohsen_f_b

سلام دوستان عزیز
نمی دونم بخش اول آموزش چطور بود.
ببخشید که کمتر توضیح دادم، سعی کردم همش با عکس باشه که درکش راحت تر باشه.
آموزش که کامل شد در مورد این نحوه برنامه نویسی باهم گفتگو می کنیم.
در ضمن دارم 2 مدل دیگه از این نوع برنامه نویسی رو آماده می کنم که انشالله در ادامه این سرسی آموزش براتون قرار میدم.
خوب بریم با هم Business Logic Layer رو طراحی کنیم.
دیشب بیشتر راه رو رفتیم و شما هم تمرین کردین و حالا سرحال شروع می کنیم.

قدم پنجم : ساخت Business Logic Layer
1-    پروژه رو باز کنید
2-    حالا باید یک پروژه جدید به همین Solution اضافه کنیم که اسمش هم میزاریم PersonBLL
لطفا مراحل رو با عکس پیش برین



3-    حالا شما لایه Business Logic Layer  به Data Access Layer متصل کنید. شما می دانید که هر لایه فقط با لایه بالای و پایینی خود می توانه ارتباط برقرار کنه.
خوب برای این کار مراحل رو همراه با عکس انجام بدین
بروی References کلیک راست می کنیم و از تب Project نام پروژه PersonDAL رو انتخاب می کنیم 




4-    دوباره بر روی Referencs کلیک راست کرده و از تب .NET گزینه System.Data.Entity رو انتخاب می کنیم


5-    حالا یک کلاس درست کنید با نام ContactEO


6-    حالا در صفحه کلاس 2 تا NameSpase باید Add کنیم
using System.Collections;
using PersonDAL;

7-    حالا شروع می کنیم به کد نویسی در بدنه کلاس
یادم رفت بگم که قبل از شروع حتما 
class ContactEO

را به
public class ContactEO
تغییر بدین.
دیدین داشت یادم میرفت بگم.  :لبخند گشاده!: 
حالا تمام مقادیر و موجودیت ها رو تعریف می کنیم.

        public int Id { get; set; }
        public string Name { get; set; }
        public string Family { get; set; }
        public string Mobile { get; set; }
        public DateTime InsertDate { get; set; }
        public DateTime UpdateDate { get; set; }

بعدش یک تابع تعریف می کنیم که نام و نام خانوادگی رو کنار هم قرار بده و بعنوان یک خروجی برای ما بصورت FullName 

        public string FullName
        {
            get
            {
                return Name + ", " + Family;
            }
        }

حالا برای عملیات ثبت و ویرایش برای مقادیر یک Validation میزاریم که چک کنه مقادیر حتما وارد شده است.

        private void ValidateSave(ref ArrayList validationErrors)
        {
            if (Name.Trim() == "")
            {
                validationErrors.Add("نام خالی وارد شده");
            }

            if (Family.Trim() == "")
            {
                validationErrors.Add("نام خانوادگی خالی وارد شده");
            }

            if (Mobile.Trim() == "")
            {
                validationErrors.Add("تلفن همراه خالی وارد شده");
            }
        }

بعدش نوبت به این میرسه کد عملیات های Insert و Update رو بنویسیم

        public bool Save(ref ArrayList validationErrors)
        {
            ValidateSave(ref validationErrors);

            if (validationErrors.Count == 0)
            {
                if (Id == 0)
                {
                    Id = ContactData.Insert(Name, Family, Mobile, InsertDate);
                }
                else
                {
                    ContactData.Update(Id, Name, Family, Mobile, UpdateDate);
                }
                return true;
            }
            else
            {
                return false;
            }
        }

*دوستان کدها کاملا ساده نوشته شده بازم هرجاش واستون نا مفهموم هستش بگین کامل توضیح بدم*
تا اینجا موفق شدیم هر 2 عملیات رو کنترل و با موفقیت انجام بدیم.
این کد هم برای DELETE استفاده می کنیم

    public void Delete()
        {
            ContactData.Delete(Id);
        }

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

        internal void MapData(Contact contact)
        {
            Id = contact.ID;
            Name = contact.Name;
            Family = contact.Family;
            Mobile = contact.Mobile;
            InsertDate = contact.InsertDate.Value;
            UpdateDate = contact.UpdateDate.Value;

        }
        public bool Select(int id)
        {
            Contact contact = ContactData.SelectById(id);

            if (contact != null)
            {
                MapData(contact);
                return true;
            }
            else
            {
                return false;
            }
        }

و در آخر این تابع که کل رکوردها رو در یک شی لیست برمیگرداند

        public static List<ContactEO> SelectAll()
        {
            List<ContactEO> contacts= new List<ContactEO>();

            List<Contact> contactDTOs = ContactData.SelectAll();

            foreach (Contact contactDTO in contactDTOs)
            {
                ContactEO ContactEO = new ContactEO();
                ContactEO.MapData(contactDTO);
                contacts.Add(ContactEO);
            }

            return contacts;
        }

در آخر کلاس مربوطه به شکل زیر میشه

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using PersonDAL;

namespace PersonBLL
{
    public class ContactEO
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Family { get; set; }
        public string Mobile { get; set; }
        public DateTime InsertDate { get; set; }
        public DateTime UpdateDate { get; set; }

        public string FullName
        {
            get
            {
                return Name + ", " + Family;
            }
        }
        private void ValidateSave(ref ArrayList validationErrors)
        {
            if (Name.Trim() == "")
            {
                validationErrors.Add("نام خالی وارد شده");
            }

            if (Family.Trim() == "")
            {
                validationErrors.Add("نام خانوادگی خالی وارد شده");
            }

            if (Mobile.Trim() == "")
            {
                validationErrors.Add("تلفن همراه خالی وارد شده");
            }
        }
        public bool Save(ref ArrayList validationErrors)
        {
            ValidateSave(ref validationErrors);

            if (validationErrors.Count == 0)
            {
                if (Id == 0)
                {
                    Id = ContactData.Insert(Name, Family, Mobile, InsertDate);
                }
                else
                {
                    ContactData.Update(Id, Name, Family, Mobile, UpdateDate);
                }
                return true;
            }
            else
            {
                return false;
            }
        }

        public void Delete()
        {
            ContactData.Delete(Id);
        }

        internal void MapData(Contact contact)
        {
            Id = contact.ID;
            Name = contact.Name;
            Family = contact.Family;
            Mobile = contact.Mobile;
            InsertDate = contact.InsertDate.Value;
            UpdateDate = contact.UpdateDate.Value;

        }
        public bool Select(int id)
        {
            Contact contact = ContactData.SelectById(id);

            if (contact != null)
            {
                MapData(contact);
                return true;
            }
            else
            {
                return false;
            }
        }

        public static List<ContactEO> SelectAll()
        {
            List<ContactEO> contacts= new List<ContactEO>();

            List<Contact> contactDTOs = ContactData.SelectAll();

            foreach (Contact contactDTO in contactDTOs)
            {
                ContactEO ContactEO = new ContactEO();
                ContactEO.MapData(contactDTO);
                contacts.Add(ContactEO);
            }

            return contacts;
        }
    }
}


و حالا پروژه را Save کنید
این هم از Business Logic Layer.
دیدن تا اینجا کاری نداشت، بزودی هم UI رو باهم می نویسیم.
دوستان اگر توضیح ندادم زیاد بخاطر اینکه تمام مفاهیم ساده هستش. از دوستان هر کس مشکل داشت در کدها سوال کنه جواب گو هستیم.

نظرتون تا اینجا چیه؟ خوب بوده؟!ساده هستش یا سخته؟!

باتشکر از تمامی دوستان
به امید موفقیت ایران و ایرانی

ادامه دارد ...

----------


## mohsen_f_b

دوستان عزیز سلام
ببخشید از اینکه این 2 روز نتونستم کامل کنم پروژه رو .
خوب بریم مرحله آخر کار هم انجام بدیم باهم دیگه.

 قدم ششم : ساخت Web Form یا همان UI Layer

1- یک پروژه جدید با نام PersonUI
نکته : لطفا این بخش رو حتما به عکس توجه کنید. دیگه Class Library انتخاب نمی کنیم.

2- حالا یک صفحه aspx با نام Person.aspx ایجاد نمایید.

3- کدهای زیر را در قسمت Source HTML صفحه وارد نمایید. با کدهای زیر جابجا کنید.

<%@ Page Language="C#‎‎‎‎" AutoEventWireup="true" CodeBehind="Person.aspx.cs" Inherits="PersonUI.Person" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <style type="text/css">
        .style1
        {
            text-align: left;
        }
    </style>
</head>
<body dir="rtl" style="font-family:Tahoma;font-size:12px">
    <form id="form1" runat="server">
    <div>
        <table>
            <tr>
                <td colspan="2">
                    <asp:Label runat="server" ID="lblErrorLabel" Text="لطفا توجه کنید :"
                        ForeColor="Red" Visible="false"></asp:Label>
                    <asp:Label runat="server" ID="lblErrorMessages" ForeColor="Red" Visible="false"></asp:Label>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    کاربر مورد نظر را انتخاب کنید :</td>
                <td>
                    <asp:DropDownList runat="server" ID="ddlUsers" AutoPostBack="True" 
                        onselectedindexchanged="ddlUsers_SelectedIndexChan  ged">
                    </asp:DropDownList>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    نام :</td>
                <td>
                    <asp:TextBox runat="server" ID="txtFirstName"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    نام خانوادگی :</td>
                <td>
                    <asp:TextBox runat="server" ID="txtLastName"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    شماره همراه :</td>
                <td>
                    <asp:TextBox runat="server" ID="txtMobile"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    تاریخ ثبت : 
                </td>
                <td>
                    <asp:Label runat="server" ID="lblInserted"></asp:Label>
                </td>
            </tr>
            <tr>
                <td class="style1">
                    تاریخ آخرین ویرایش :
                </td>
                <td>
                    <asp:Label runat="server" ID="lblUpdated"></asp:Label>
                </td>
            </tr>
        </table>
        <asp:Button runat="server" ID="btnSave" Text="ثبت" Font-Names="Tahoma" 
            onclick="btnSave_Click" Width="100px" />
        <asp:Button ID="btnDelete" runat="server" Text="حذف" Font-Names="Tahoma" 
            onclick="btnDelete_Click" Width="100px" />
    </div>
    </form>
</body>
</html>


4- حالا بریم در صفحه Code Behind
اول از همه باید لایه Business رو به پروژه اضافه کنید.
بروی References پروژه کلیک راست کنید و Add References را کلیک کنید.
و لایه PersonBLL را انتخاب کنید.


حالا namespace PersonBLL  را به صفحه با کد زیرAdd  کنید.
using PersonBLL;
5- حالا برای اینکه اطلاعات در DropDown نمایش داده شود این تابع را می نویسیم.

        //نمایش کاربران در DROPDOWN
        private void LoadUserDropDownList()
        {
            ddlUsers.DataSource = ContactEO.SelectAll();

            ddlUsers.DataTextField = "FullName";
            ddlUsers.DataValueField = "Id";
            ddlUsers.DataBind();

            ddlUsers.Items.Insert(0, new ListItem("ایجاد کاربر جدید", ""));
        }

6- در Page Load تابع بالا را فراخوانی می کنیم.

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadUserDropDownList();
            }
        }


7- در Evant Click  مربوط به دکمه ثبت کدهای زیر را قرار می دهیم

        //انجام عملیات ثبت و بروزرسانی
        protected void btnSave_Click(object sender, EventArgs e)
        {
            ArrayList validationErrors = new ArrayList();
            ContactEO userAccount = new ContactEO();

            if (ddlUsers.SelectedItem.Value != "")
            {
                //ویرایش
                userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
            }

            userAccount.Name = txtFirstName.Text;
            userAccount.Family = txtLastName.Text;
            userAccount.Mobile = txtMobile.Text;

            userAccount.Save(ref validationErrors);

            if (validationErrors.Count > 0)
            {
                ShowValidationMessages(validationErrors);
            }
            else
            {
                //فراخوانی دوباره  DropDwon
                LoadUserDropDownList();

                //Select the one the user just saved.
                ddlUsers.Items.FindByValue(userAccount.Id.ToString  ()).Selected = true;

                lblErrorLabel.Visible = false;
                lblErrorMessages.Visible = false;
            }
        }

8-   تابع زیر هم برای نمایش پیغام ها کد نویسی می کنیم.
  //نمایش پیغام ها
        private void ShowValidationMessages(ArrayList validationErrors)
        {
            if (validationErrors.Count > 0)
            {
                lblErrorLabel.Visible = true;
                lblErrorMessages.Visible = true;
                lblErrorMessages.Text = "<br />";

                foreach (string message in validationErrors)
                {
                    lblErrorMessages.Text += message + "<br />";
                }
            }
            else
            {
                lblErrorLabel.Visible = false;
                lblErrorMessages.Visible = false;
            }
        }

9- در Evant SelectedIndexChanged مربوط به DropDown هم کد های زیر را قرار می دهیم.

        protected void ddlUsers_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtFirstName.Text = "";
            txtLastName.Text = "";
            lblInserted.Text = "";
            lblUpdated.Text = "";

            if (ddlUsers.SelectedValue != "")
            {
                //زمانی که یک کاربر انتخاب شود، کاربر مورد نظر را در مکان های مورد نظر قرار میدهد

                int userAccountId = Convert.ToInt32(ddlUsers.SelectedValue);

                ContactEO userAccount = new ContactEO();
                if (userAccount.Select(userAccountId))
                {
                    txtFirstName.Text = userAccount.Name;
                    txtLastName.Text = userAccount.Family;
                    txtMobile.Text = userAccount.Mobile;
                    lblInserted.Text = userAccount.InsertDate.ToString();
                    lblUpdated.Text = userAccount.UpdateDate.ToString();
                }
            }
        }


10- و در آخر در Evant Click مربوط به دکمه حذف هم کدهای زیر را قرار می دهیم.


//عملیات حذف
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            if (ddlUsers.SelectedItem.Value != "")
            {
                ArrayList validationErrors = new ArrayList();
                ContactEO userAccount = new ContactEO();

                userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
userAccount.Delete();
                    LoadUserDropDownList();
                    txtFirstName.Text = "";
                    txtLastName.Text = "";
                    txtMobile.Text = "";
                    lblInserted.Text = "";
                    lblUpdated.Text = "";
                    lblErrorLabel.Visible = false;
                    lblErrorMessages.Visible = false;
                
            }
        }

11- در آخر صفحه Code Behind ما به صورت زیر می باشد

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using PersonBLL;


namespace PersonUI
{
    public partial class Person : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadUserDropDownList();
            }
        }

        //نمایش کاربران در DROPDOWN
        private void LoadUserDropDownList()
        {
            ddlUsers.DataSource = ContactEO.SelectAll();

            ddlUsers.DataTextField = "FullName";
            ddlUsers.DataValueField = "Id";
            ddlUsers.DataBind();

            ddlUsers.Items.Insert(0, new ListItem("ایجاد کاربر جدید", ""));
        }

        //انجام عملیات ثبت و بروزرسانی
        protected void btnSave_Click(object sender, EventArgs e)
        {
            ArrayList validationErrors = new ArrayList();
            ContactEO userAccount = new ContactEO();

            if (ddlUsers.SelectedItem.Value != "")
            {
                //ویرایش
                userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
            }

            userAccount.Name = txtFirstName.Text;
            userAccount.Family = txtLastName.Text;
            userAccount.Mobile = txtMobile.Text;

            userAccount.Save(ref validationErrors);

            if (validationErrors.Count > 0)
            {
                ShowValidationMessages(validationErrors);
            }
            else
            {
                //فراخوانی دوباره  DropDwon
                LoadUserDropDownList();

                //Select the one the user just saved.
                ddlUsers.Items.FindByValue(userAccount.Id.ToString  ()).Selected = true;

                lblErrorLabel.Visible = false;
                lblErrorMessages.Visible = false;
            }
        }

        //نمایش پیغام ها
        private void ShowValidationMessages(ArrayList validationErrors)
        {
            if (validationErrors.Count > 0)
            {
                lblErrorLabel.Visible = true;
                lblErrorMessages.Visible = true;
                lblErrorMessages.Text = "<br />";

                foreach (string message in validationErrors)
                {
                    lblErrorMessages.Text += message + "<br />";
                }
            }
            else
            {
                lblErrorLabel.Visible = false;
                lblErrorMessages.Visible = false;
            }
        }

        
        protected void ddlUsers_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtFirstName.Text = "";
            txtLastName.Text = "";
            lblInserted.Text = "";
            lblUpdated.Text = "";

            if (ddlUsers.SelectedValue != "")
            {
                //زمانی که یک کاربر انتخاب شود، کاربر مورد نظر را در مکان های مورد نظر قرار میدهد

                int userAccountId = Convert.ToInt32(ddlUsers.SelectedValue);

                ContactEO userAccount = new ContactEO();
                if (userAccount.Select(userAccountId))
                {
                    txtFirstName.Text = userAccount.Name;
                    txtLastName.Text = userAccount.Family;
                    txtMobile.Text = userAccount.Mobile;
                    lblInserted.Text = userAccount.InsertDate.ToString();
                    lblUpdated.Text = userAccount.UpdateDate.ToString();
                }
            }
        }

        //عملیات حذف
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            if (ddlUsers.SelectedItem.Value != "")
            {
                ArrayList validationErrors = new ArrayList();
                ContactEO userAccount = new ContactEO();

                userAccount.Id = Convert.ToInt32(ddlUsers.SelectedValue);
userAccount.Delete();

                    LoadUserDropDownList();
                    txtFirstName.Text = "";
                    txtLastName.Text = "";
                    txtMobile.Text = "";
                    lblInserted.Text = "";
                    lblUpdated.Text = "";
                    lblErrorLabel.Visible = false;
                    lblErrorMessages.Visible = false;
                
            }
        }

    }

}

12- تا اینجا که مشکلی نبود، حالا فقط 2 تا نکته هستش که باید ConnectionStirng مربوط به Entity Framework که در web.config لایه PersonDAL هستش رو در Web.Config مربوط به  پروژه PersonUI اضافه کنیم.
ConnctionStirng رو از web.config  لایه PersonDAL  کپی کنید و در web.config پروژه PersonUI  اضافه کنید.
<connectionStrings>
    <add name="PersonEntities" connectionString="metadata=res://*/PersonDataModel.csdl|res://*/PersonDataModel.ssdl|res://*/PersonDataModel.msl;provider=System.Data.SqlClient  ;provider connection string=&quot;Data Source=MOHSEN-PC\SQL2008R2;Initial Catalog=Person;Integrated Security=True;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

نکته دوم : انتخاب PersonUI بعنوان پروژه زمان اجرا


حالا برنامه را اجرا کنید.

دوستان در کدها هرجاش مشکلی داشتین بگین تا توضیح بدم.
پایان
نظرتون چیه دوستان؟!

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

و بزودی ==> آموزش استفاده از Entity Framework در معماری 3 لایه توسط دستورات LINQ (دیگه از SP ها استفاده نمی شه)

موفق باشید

----------


## shahab_ksh

شما چرا برای ورود تغییرات در دیتا از Stored Procedures استفاده کردید چرا از خود Entity Frimework استفاده نکردید؟

----------


## mohsen_f_b

> شما چرا برای ورود تغییرات در دیتا از Stored Procedures استفاده کردید چرا از خود Entity Frimework استفاده نکردید؟


سلام دوست عزیز
من می خواستم کل رویه ها از طریق Stored Procedures انجام بشه. می شه تمام عملیات ها رو هم مستقیم از طریق Entity Framework انجام داد. ولی من شخصا اینطوری انجام دادم. بالا هم توضیح نوشتم این یک نمونه هستش.راه های زیادی میشه استفاده کرد. وقت بشه حتما با تغییرات برای روش های دیگر هم میزارم. شما هم اگه وقت دارین اصلاح کد به روش های دیگه هم بزارین.
باتشکر از شما دوست عزیز shahab_ksh جان

----------


## baharkarimi

خیلی خوب و واضح توضیح دادی مرسی

----------


## arefba

به نظرت وقتش نیست لایه آخر رو توضیح بدی و کل پروژه رو بزاری ؟؟

----------


## mohsen_f_b

> به نظرت وقتش نیست لایه آخر رو توضیح بدی و کل پروژه رو بزاری ؟؟


سلام دوست عزیز 

بخش بعدی اضافه شد.
فایل پروژه اضافه شد.
موفق باشید.

----------


## TheCoder

آقا من این پروژه رو درست کردم
موقع insert خطا میده

----------


## TheCoder

چیزی که من درست کردم اینه

----------


## mohsen_f_b

> چیزی که من درست کردم اینه


سلام دوست عزیز

فکر نکنم من اینطوری که آموزش دادم شما برنامه رو طراحی کرده باشید!!!
لطفا از مثالی که گذاشتم استفاده نمایید!

موفق باشید

----------


## samadblaj

دوست عزیز چرا تحت وب؟چقدر کامل و واضح بود حیف شد./

----------


## mohsen_f_b

> دوست عزیز چرا تحت وب؟چقدر کامل و واضح بود حیف شد./


سلام دوست عزیز
تحت ویندوز می خواستین باشه؟زیاد فرقی نداره که دوست من.
اگه می خواین براتون بنویسیم بفرستم.

موفق باشید

----------


## samadblaj

*یعنی این کارو میکنید !*

*اینجوری میفتید تو زحمت خیلی با معرفتی حالا شروع میکنم مینویسم ببینم میتونم.*

----------


## mohsen_f_b

> *حالا شروع میکنم مینویسم ببینم میتونم.*


لایه های DAL و  BLL همون هستن و فقط توی UI شما باید فرم ویندوزی بزنید.

موفق باشید

----------


## samadblaj

*نه بی خیالش اینجوری درست مفهوم رو نمیگیرم (تحت وب)*

*ولی بازم بایت این زحماتت تشکر میکنم.*

*موفق باشید*

----------


## mohsen_f_b

> *نه بی خیالش اینجوری درست مفهوم رو نمیگیرم (تحت وب)*


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

موفق باشی

----------


## jafari1

با سلام و عرض تشکر
اگر لایه یوزر ویندوز فرم باشد بهتر است ضمنا به نظر این برنامه ساده با این روش اینقدر طولانی شده است

----------


## samadblaj

> دوست عزیز تا امشب صبر کن براتون می نویسیم میزارم برای دانلود.
> 
> موفق باشی


*جدی ! ممنونم دوست عزیز منتظرما...*

----------


## zahrashoja

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

و من یه مشکلی داشتم:
public List<News> selectfromnews(int idd)
    {
        
     var  cell = (from row in ag.News where row.nid == idd select new {row.ndate,row.ntex});

     List<News> l = cell.ToList();
        
        return l;
    }
می خوام یه select چند ستونه داشته باشم و حاصلش رو return کنم ولی توی تبدیل نوع هاش موندم... var رو که نمیشه return کرد.. و حاصل  select چند ستونه رو هم نمیشه ریخت توی list....... خواهش میکنم اگه میدونی کمکم کن..من تاشهریور باید پروژمو تحویل بدم

----------


## gama_slv

در  Ef در قسمت تنظیمات جداول قسمتی هست که سه متد Insert,Update,Delete داره و میشه روال های ذخیره شده مورد نظر خودمون رو به جداول وصل کنیم میخواستم بدونم کاربرد این قسمت چیه؟
ef up.jpg
ef dt.jpg

----------


## mar236

سلام... چرا از معماري 3 لايه استفاده كنيم؟ .. درسته كه اين روش نظم بيشتري داره ولي طولاني تر از حالت عاديه ...

----------


## Saber_Fatholahi

> سلام... چرا از معماري 3 لايه استفاده كنيم؟ .. درسته كه اين روش نظم بيشتري داره ولي طولاني تر از حالت عاديه ...


 دوست من اگر جستجو ساده ای بکنین می بینین درسته طولانیه اما انعطاف پذیرتره

موفق وموید باشید

----------


## h_r_sh

مرسی بابت زحمتی که کشیدید. 
اگه می شه فقط قسمت Update رو با استفاده از Linq و  EntityFrameWorkDesigner.edmx توضیح بدید.

----------


## amir7ta

سلام  
من یه مشکلی دارم
آقا محسن هر نکته ای که گفتین رو رعایت کردم 
اما موقع ثبت ،حذف، و یا هرکار دیگه ای این خطا رو میده
The data reader is incompatible with the specified 'testModel.student'. A  member of the type, 'name', does not have a corresponding column in the  data reader with the same name.
این store procedure که نوشتم و همونجوری که گفتین import function کردم 

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[insert_student]
    
    (
    @name nvarchar,
    @l_name nvarchar,
    @f_name nvarchar,
    @national_code nvarchar,
    @sh_sh nvarchar,
    @image binary(4000),
    @burn_date datetime,
    @burn_city nvarchar,
    @class_id bigint
    
    )
    
AS
     SET NOCOUNT ON 
    
insert into student 
([name],l_name,f_name,burn_date,national_code,sh_sh,[image],burn_city,class_id)
values
(@name,@l_name,@f_name,@burn_date,@national_code,@  sh_sh,@image,@burn_city,@class_id)

RETURN

تمام sp ها همین خطا رو میدن
تمام عملیات روی تمام جدول ها
ببینید insert رو انجام میده اطلاعات توی جدول ثبت میشه اما این خطا رو میده و برنامه متوقف میشه
اول فکر کردم به اسم فیلد گیر داده که اونو عوض کردم بازم همین خطا رو  میداد و برای هر جدول با هر اسمی با هر نوع فیلدی همین خطا رو میده بجای  'name' اسم فیلد رو مینویسه
 فقط هم فیلد اول هر جدول رو میگه ، مثلا توی پیغام خطای  بالا فیلد نام اولین فیلد جدول student بود
مثل اینکه در مورد نوع مقدار  بازگشتی از جدول خطا داده، کد هم به این شکل تعریف شده

 public static student Insert_student(string name, string l_name, string  f_name, string national_code, string sh_sh, byte[] image, DateTime  burn_date, string burn_city, Int64 class_id)
        {
            testEntities db = new testEntities ();
            return db.insert_student(name, l_name, f_name,  national_code, sh_sh, image, burn_date, burn_city,  class_id).ElementAt(0);
        }

student در کد بالا entity هست که توی مثال شما entity همان contact بود

 ممنون میشم اگر کسی کمک کنه،

----------


## nilda_15

سلام
این برنامه رو با مراحل گفته شده در قسمت آموزش انجام دادم و برنامه درست جواب میدهد
البته واسه منم فقط دستور ذخیره خطا میداد به قول آقای *amir7ta* اطلاعات رو ذخیره میکنه و لی خطا میداد
من اومدم پروکسیجر مربوط به دستور ذخیره رو بدون خروجی کردم در کد نویسی هم توابع مربوط به درج اطلاعات رو بدون خروجی (Return) کردم
با این کار اطلاعات ذخیره میشود و هیچ خطایی رخ نمیدهد

----------


## amir7ta

منم مجبور شدم بجای return   از select استفاده کنم و اینجوری مشکل حل شد ،مثلا بعد از پروسیجر insert ، رکورد ثبت شده رو با select برمیگردونم و دیگه برای پروسیجرهای insert  و update  مشکل نداره
اما برای delete  چون مجبورم یه مقدار برگردونم باید از return  استفاده کنم و هنوز مشکل پا برجاست آخه سطر حذف شده رو که نمیتونم با select برگردونم و باید یه پارامتر  return کنم که ببینم sp اجرا شده یا نه.
دقیقا هم میدونم مشکل کجاس اما نمیتونم حلش کنم
موقعی که توی مدل داریم فانکش میسازیم و sp ها رو import  میکنیم ، اونجایی که نوع پارامتر بازگشتی از sp رو مشخص میکنیم  اگر پارامتر بازگشتی با return باشه خطا ایجاد میشه اما اگه خروجی sp یه سطر از جدول باشه درواقع یک entity باشه دیگه خطایی نمیده امیدوارم کسی بتونه کمک کنه

----------


## zahrashoja

میشه بطور خلاصه و جمع شده بگین چه قسمت هایی در کدوم لایه قرار می گیرن البته بدون استفاده از store procedure

----------


## zare69

سلام دوستان 
من تمام این مراحل گفته شده را انجام دادم ولی زمانی که می خواهم یه سطر جدید در بانک ایجاد کنم خطا زیر را میدهد.کسی میتونه منو راهنمایی کنه.
البته لازم به ذکر که من این مراحل را در سی شارپ انجام دادم.
Untitled1.png

----------


## zare69

من چند تا سوال داشتم در مورد این روش:
1-اگر ما چند تا جدول در بانک داشته باشیم به ازای هر کدام باید تمام این مراحل را انجام بدیم ؟و برای هر کدوم 5 تاSPایجاد کنیم؟ :متعجب: 
2-اگر بخواهیم ی تغییری در جداول انجام بدیم برای اعمال کردن تغییرات به مراحل دیگر دستی باید این کار را انجام بدیم؟ :متعجب: 
3-در این صورت مزیت این روش چیه؟چون هم انجام دادن این مراحل زمانبر و وقت گیره وهم برای اعمال ی تغییر کوچیک دوباره از اول باید شروع به کار کرد. :متفکر:

----------


## amir7ta

> سلام دوستان 
> من تمام این مراحل گفته شده را انجام دادم ولی زمانی که می خواهم یه سطر جدید در بانک ایجاد کنم خطا زیر را میدهد.کسی میتونه منو راهنمایی کنه.
> البته لازم به ذکر که من این مراحل را در سی شارپ انجام دادم.
> Untitled1.png


 فایل app.config رو از لایه dal به لایه ui اضافه کن درست میشه

----------


## starwold

سلام و خیلی ممنون از شما بابت این منبعی که برای آشنایی بهتر برای ما گذاشتید

میخواستم از شما اگه میتوانید برای آپلود نمودن عکس و ذخیره کردن در دیتا بیس کد سی شارپشو برامون بزارید یا لینکی که کمکمون کنه

ممنون

----------


## starwold

سلام من این پروژه رو اجرا نمودم ولی برای من خطا صادر میکند میتونین برای رفع خطا به من کمک کنید ممنون
error.jpg

----------


## pikoolas

> انشالله که بدردتون خورده باشه.بازم شرمنده اگه کوتاهی کردم.
> 
> و بزودی ==> آموزش استفاده از Entity Framework در معماری 3 لایه توسط دستورات LINQ (دیگه از SP ها استفاده نمی شه)
> 
> موفق باشید


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

----------


## b.najafi_1387

میشه خواهش کنم همین پروژه رو تحت ویندوز ( با EntityFrameWork و معماری 3 لایه) بزارید؟ خیلی سرچ کردم اما چیز جالبی پیدا نکردم ؛ توضیحات شما خیلی کامله ؛ممنون

----------


## f.rahdar

دوستان لطفا بیشتر توضیح بدید برای رفع مشکل جکار کنیم؟کجاهاreturn رو برداریمselect بزاریم؟؟؟؟؟؟؟؟؟

آقا محسن 1زحمت دیگه بکشید و برای حل مشکل راهنمایی کنید.ممنون

----------


## farzaneh66

> سلام من این پروژه رو اجرا نمودم ولی برای من خطا صادر میکند میتونین برای رفع خطا به من کمک کنید ممنون
> error.jpg




به من هم همین خطا رو میده !!

----------


## yhsoft

برنامه ای که را دانلود گذاشتین اجرا نمیشه ؟؟؟
چیکار باید کرد؟؟/

----------


## mosadatta

با تشکر
من هم در زمان درج خطا میده
و برنامه اصلی هم خظای زیر را میده

----------


## malloc

خوب از دوستان کمال تشکر رو دارم  :بامزه: 
منم به خطایی که در پست 29 گفتن خوردم و راحلی که در پست 31 گفتن رو هم تست کردم اما درست نشد.

مسئولین این تاپیک مشکلات و رسیدگی کنن لطفا

----------


## bormohsen

3 layer Generator
نرم افزاری جهت تولید خودکار لایه های برنامه های تجاری در سایت مهندس محسن مدحج www.howprg.comبرنامه نویس مهندس نادر غریبیان فرد

----------


## mohsen406

با سلام 
محسن جان آموزش خیلی جالبی گذاشتی خیلی خوب بومنم دارم واسه پیاده سازی یک پروژه از entity framework استفاه می کنم.
یم مشکلی دارم که چند تا راه حل داره به نظر تو راه حل خوبش کامه؟
من تو لایه UI نمیتوانم ابجکت ها را ببینم چون  لایه DAL را نمیبینه. به نظرت چیکار کنم که به طور مثال بتونم تو لایه DAL یک آبجکت که لایه های پایینی ایجاد کردند را ببینم؟

----------


## fa_karoon

سلام ممنون از آموزش خوبتون، ولی چرا عکس های صفحه اول برای من نمیاد هر جا گفتین به تصویر زیر دقت کنین تصویرش برای من نیست :ناراحت:

----------


## fa_karoon

سلام چرا این تاپیک دیگه پیگیری نمی شه، خیلی مطلب مفیدی بود دست همه درد نکنه

----------


## sahar15125

ن چطور توی یک پروژه وب ازون استفاده کنم؟
میشه یه نفر منو راهنمایی کنم من سریعا لازمه که اینکارو روی یه پروژه وب ساده انجام بدم
ممنون

----------


## mojtabaa1975

سلام
ضمن تشکر از مطالب مفیدتون ، بنظر میرسه Image ها باز نمیشن (حتی با راست کلیک و ShowPicture)
ممکنه کمکم کنید ، اگه امکان داره تصاویر رابرام بفرستین 
ممنون

----------


## fa_karoon

سلام دوستان، لطفا من رو راهنمایی کنید.
آیا در وب استفاده از این روشی که در این تاپیک یاد دادشده بهتر هست یعنی استفاده از store Procedure ها، یا اینکه می توانیم بدون استفاده از store Procedure ها
و با کد نویسی معمولی در صفحاتمون هم Entity Frame Work رو پیاده سازی کنیم؟
می خوام بدونم کدوم راهش اصولی تر و امن تر هست؟ ممنون از وقتی که می گذارید.

----------


## fa_karoon

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

----------


## toojaldey

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

----------


## hodaalimi

سلا م عکس هایی که توضیحات رو گذاشتین باز نمی شن

----------


## mina.nafari

با سلام 
آقای mohsen_f_b شما لطف کردید و مطالب رو گذاشتید، ممنون از شما دوست  عزیز. لطفا جهت وضعیت تصاویری که قابل رویت نیست، زحمتی رو متحمل بشید . با  تشکر

----------


## ferdin

> با سلام 
> محسن جان آموزش خیلی جالبی گذاشتی خیلی خوب بومنم دارم واسه پیاده سازی یک پروژه از entity framework استفاه می کنم.
> یم مشکلی دارم که چند تا راه حل داره به نظر تو راه حل خوبش کامه؟
> من تو لایه UI نمیتوانم ابجکت ها را ببینم چون لایه DAL را نمیبینه. به نظرت چیکار کنم که به طور مثال بتونم تو لایه DAL یک آبجکت که لایه های پایینی ایجاد کردند را ببینم؟


توی لایه UI چه نیازی داری که آبجکتهای مدل رو ببینی؟
شما میتونی یک لایه بین dal و ui  داشته باشی به نام dto.
dto کلاسهایی هست که یک سری پراپرتی که معادل فیلدهای جداول یا .. هست .

----------


## orca13

دوستان روش استفاده نکردن از SP چجوری هستش؟
میشه یه توضیح بدید؟

----------


## saramigmigmig

اگه نخواهیم از استورپروسیجر استفاده کنیم دیگه در لایه dal فقط فایل edmx را خواهیم داشت؟ دیگه چیزی به عنوان class library نداریم؟

----------


## RK977877

با سلام 
میشه متد() SelectAll  مربوط به کلاس ContactEO رو بیشتر توضیح بدبد من متوجه نشدم
مرسی

----------


## mehregan

در صورت امکان آموزش را بصورت یک فایل pdf قرار دهید.

----------


## leila94

در پست اول هنگام add کردن sp ها گفتن با توجه به عکس stored prosedure insert  رو اد کنید دقت کنید چون آیدی برمیگردونه با باقی sp  ها فرق میکنه ولی عکس موجود نیست.
لطفا توضیح دهید که برای اد کردن insert و الباقی باید چکار کنم , عکس موجود نیست  :افسرده: 
ممنون

----------


## bahar_engineer

> سلام دوستان عزیز
> نمی دونم بخش اول آموزش چطور بود.
> ببخشید که کمتر توضیح دادم، سعی کردم همش با عکس باشه که درکش راحت تر باشه.
> 
> ادامه دارد ...


سلام خوبین
مرسی از آموزش خوب و کاملتون
استفاده از عکس ایده خوبی بود اما الان عکس ها باز نمی شن و نمی شه از آموزش استفاده کرد، متاسفانه
عکس ها رو دارید ؟ :افسرده:

----------


## h1and1saman

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

----------

