using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Web;

namespace Models
{
    /// <summary>
    /// نام این کلاس هر چه میتواند باشد ولی حتما باید از کلاس دی بی کانتکست اینهریت شود
    /// </summary>
    public class DataBaseContext : System.Data.Entity.DbContext
    {
        #region سازنده استاتیک کلاس
        /// <summary>
        /// سازنده استاتیک کلاس دیتا بیس کانتکست
        /// این سازنده حداکثر یک بار اتفاق میفتد
        /// یا اولین بار که با یک ممبر استاتیک از این کلاس کار کار میکنیم
        /// یا اولین بار که یک شی از این کلاس میسازیم 
        /// این سازنده اور لود ندارد و اکسز مادی فایر نیز ندارد و خروجی هم ندارد
        /// استراتژی های دیتا بیس را در این سازنده مینویسم
        /// </summary>
        static DataBaseContext()
        {
            // اين گزينه به درد قشر خاصی از برنامه نويسان می خورد که با اطلاعات رندوم کار میکنند
            //این استراتژی یعنی هر وقت که برنامه اجرا میشود اگر دیتا بیس وجود ندارد میسازد و 
            //اگر هم وجود داشت هر بار دیتابیس پاک میشود و دوباره ساخته میشود
            //System.Data.Entity.Database.SetInitializer
            //    (new System.Data.Entity.DropCreateDatabaseAlways<DatabaseContext>());

            // اين گزينه به درد برنامه نويسان می خورد
            //این استراتژی یعنی هر وقت که برنامه اجرا میشود اگر دیتا بیس وجود ندارد میسازد و 
            //اگر در مدل تغییری حاصل شده بود دیتا بیس را پاک میکند و مجددا میسازد
            //افزودن و پاک کردن فیلد  و پراپرتی در مدل نیز جز تغییرات حساب میشود
            //از کلاس دیتا بیس کانتکست اینیشیالایزر یک شی میسازیم که از سناریو مورد نظر استفاده میکند
            //و همچنین کلاس دیتا بیس کانتکست اینیشیالایزر حاوی اطلاعات پایه ای است که در متد سید موجود است

            //System.Data.Entity.Database.SetInitializer(new DataBaseContextInitializer());

            // اين گزينه به درد مشتری می خورد
            //اگر دیتا بیس وجود نداشت میسازد
            //System.Data.Entity.Database.SetInitializer
            //    (new System.Data.Entity.CreateDatabaseIfNotExists<DatabaseContext>());

            //Migration
            //اگر دیتا بیس وجود نداشته باشد میسازد
            //اگر وجود داشته باشد و مدل تغییری نکرده باشد کاری ندارد
            //اگر وجود داشته باشد و مدل تغییری کرده باشددیتا ببس به آخرین نسخه قبلی مایگریت میشود و سپس تغییرات در آن لحاظ میشود

            System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<DataBaseContext, Models.Migrations.Configuration>());

        }
        #endregion

        #region سازنده پیش فرض
        /// <summary>
        /// سازنده پیش فرض 
        /// به تعداد دفعاتی که شی ساخته میشود این سازنده فراخوانی میشود
        /// در این سازنده با فراخوانی بیس نام دیتا بیسی که در بانک اطلاعات ساخته میشود را خودمان مشخص میکنیم
        /// لیزی لودینگ را در کانفیگوریشن نیز اعمال نمودیم
        /// </summary>
        public DataBaseContext()
            : base("PaylineAsp")
        {
            Configuration.LazyLoadingEnabled = true;
        }
        #endregion

        #region ایجاد جداول
        /// <summary>
        /// ساخت یک کالکشن جنریک از جنس کانتری با نام کانتریز
        /// جنس این کالکشن از دی بی ست هست ولی میتوان هر کالکشن جنریک دیگری نیز ایجاد نمود
        /// کالکشن های دیگر همچون هش تیبل - لیست - ای اینام ریبل - دیکشنری 
        /// </summary>
        /// 
        public DbSet<Payment> Payments { get; set; }

        #endregion

        #region ارتباط جداول و کانفیگورها
        /// <summary>
        /// متد اورراید آن مدل کریتینگ 
        /// در این متد کانفیگور های موجود در کلاس های مدل را به برنامه اد میکنیم
        /// </summary>
        /// <param name="modelBuilder"></param>
        protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

        }
        #endregion
    }
}