Open
Soğan Mimarisi

Data Access Layer, Bussiness Logic ve User Interface'miz olacak ve herbirinin görebileceği Entitilerimiz (Model)
Çözüm (solution) oluşturup bir isim verelim.
Önce her katmanın eriştiği ModelKatmanı (entitiler'i) oluşturalım.
Projemize, Class Library ekleyip (.dll uzantılıdır, dll'ler oluşturur).İsim olarak genelde, Çözüm adı neyse, onu katmanıyla ekleriz.
örn; Katman solution adı ise eklediğimi class library : Katman.model olabilir.
Katman.Dal, Katman.Bll, Katman.UI,(UI web aplikasyondur) Katman.Model (hepsinin kullanacağı Entity modeli)
Bll referans olarak Dal'ı, UI referans olarak Bll'yi ve Model katmanını ise hepsi referans alır. Entity sınıflar burda çünkü.Entegre ettikten sonra Projeye başlayabiliriz. Projemiz güvenli bir çözümde gelişecek
İlk önce Entitilerimizi oluşturalım

Entity Model

Base adında bir entity class oluşturup public ettik çünkü diğer tablolara kalıtım alıcak.
Bu sınıfın amacı ID,DateTime,IsDelete ortak kullanılan bir propertileri olsun.

Hadi Entity Modelimizi oluşturalım

     public class E_Base
    {
        public int ID { get; set; } 
        public DateTime DateTime { get; set; }
        public bool IsDelete { get; set; }
    }
        public class E_Listing :E_Base
   {
       [Key]
       public int ListingID { get; set; }
       [Required]
       [StringLength(250)]
       public string Title { get; set; }
       public string Body { get; set; }
       public string Room { get; set; }
       [DefaultValue(true)]
       public bool IsActive { get; set; }
       [DefaultValue(true)]
       public bool IsJustListed { get; set; }
       [DefaultValue(false)]
       public bool IsSold { get; set; }
       public int Orderby { get; set; }
       [StringLength(250)]
       public string Thumbnail { get; set; }
       [Required]
       [DefaultValue(0)]
       public int ViewCount { get; set; }
       
       public int ImageID { get; set; }
       [ForeignKey("ImageID")]
       public virtual E_Image vImageID { get; set; }
       public int CityID { get; set; }
       [ForeignKey("CityID")]
       public virtual E_City vcityID { get; set; }
      //vCityID-si CityID isimli özelliktir ve Tbl_City tablosundaki ilişkilendirilmiş bilgiyi işaret eder

       //ya da
       //[ForeignKey("vCityID")]
       //public int CityID { get; set; }
       //public virtual E_City vCityID { get; set; }
 
    }
 
       public  class E_City
    {
        [Key]
        public int CityID { get; set; }
        public string CityName { get; set; }
        public int? UstCityID { get; set; } //null olabilir default valuesü 0 zaten
      //Bu kategori kendi kendisiyle ilişkilendirilecektir UstKategoriID - (identity)KategoryID ile
      //yani ustkategoriden tutup kategoriID ye attık.
        //kimi işaret ediyor Foreign ile gösterelim
        [ForeignKey("UstCityID")]
        public virtual E_City vUstCategoryID { get; set; }
    }


    public class E_Blog :E_Base
   {
       [Key]
       public int BlogID { get; set; }
       public string Title { get; set; }
       public string Body { get; set; }
       public string ImageUrl { get; set; }
       [DefaultValue(0)]
       public int ViewCount { get; set; }
       public int UserID { get; set; }
       [ForeignKey("UserID")]
       public virtual E_User vUserID  { get; set; }

 
    }


   public class E_Comment:E_Base
   {
       [Key]
       public int CommentID { get; set; }
       public string Body { get; set; }
       public int UserID { get; set; }
       [ForeignKey("UserID")]
       public virtual E_User vUserID  { get; set; }
       public int BlogID { get; set; }
       [ForeignKey("BlogID")]
       public virtual E_Blog vBlogID { get; set; }
    }

    }

Sıra Dal da

Eğer entitilerimizle create tablo oluşturup bir veritabanı meydana getirmek istiyorsak.
Dal klasöründe uygun bir entityframework gibi bir klasör oluşturup Ado.Net Entity Data Model ekleriz
ismin sonuna Context ekleyebiliriz. (standart öyledir örn; KatmanContext) ve Empty Code First Model seçeriz.
public virtual DbSet<E_Tablo> TabloAdı { get; set; } gibi bilgilerini ilişkilendirir.
model yaratacağımızı söyleriz Convertions gelenek yapılacağını söyleriz. aşağıdaki örnek gibi;

Model ve UI katmanımıza Entity Framework kütüphanesini ekleyelim.
Sonra packaga manager Console açıp üstte JobListng.Model seçeriz ve enable-migrations yazarız.


            public KatmanContext()
            : base("name=KatmanContext")
        {
            Database.SetInitializer<KatmanContext>(new CreateDatabaseIfNotExists<KatmanContext>());
        }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
            base.OnModelCreating(modelBuilder);
        }
        // Add a DbSet for each entity type that you want to include in your model. For more information 
        // on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109.
        public virtual DbSet<E_Blog> Tbl_Blog { get; set; }
        public virtual DbSet<E_City> Tbl_City { get; set; }
        public virtual DbSet<E_Comment> Tbl_Comment { get; set; }
        public virtual DbSet<E_Image> Tbl_Image { get; set; }
        public virtual DbSet<E_Listing> Tbl_Listing { get; set; }
        public virtual DbSet<E_User> Tbl_User { get; set; }
        public virtual DbSet<E_UserRole> Tbl_UserRole { get; set; }
        
    }



Sıra business logic layer da

ilk önce BaseRepository adında bir sınıf oluşturuyoruz.
<T> demek bu class herhangi bir tabloya dönüştürülebilir demektir.
<T> T olması şart değil bu a b c de olabilirdi. T generic type oluşturuyoruz demektir.
Microsoft değiştirileilir şeylere genelde T diyor.
public class BaseRepository <T> yani ben buraya baserepository clasını oluşturuyorum sen <T> bu alana hangi classı verirsen ona dönüşürüm diyorum.Buraya ne istersen yazabilirsin.
Fakat <T>bu alana herşey yazmasını istemiyorum.Bu kdar özgür olmasın. Amacı tabloları kaydetmek bu classın
KAfasına göre int,string gibi türler yazamasın diye şöyle yazıyoruz
public class BaseRepository <T>where T:class T bir classdır diyoruz
BaseRepository <T>where T:class, new() hatta instance da alabilsin.


crud işlemi için ilk önce bir context nesnesi oluşturcaz
protected readonly KatmanContext context = new KatmanContext(); - protected yaptık herkes kafasına göre erişemesin.sadece miras alanlar erişebilrsin.
Private da diyebilirdik. ama o zaman repository dışında kimse erişemez.
İlk ekleme metodu yapıyoruz bize ID dönebilir, tablonun hepsini dönsün, ya da sonuç_mesaj adında bi class oluşturup uyarı oluşturabiliriz.
Basit olması için True False dönsün
public Bool Add() - ne ekliycez hangi tabloyu,hangi datayı bilmiyoruz.O yüzden hepsine T dedik.Set entity framework nesnesi olduğu için Entity Framework ekleyelim
Eğer eklemezse aşağıdaki not'a bakın

      protected readonly KatmanContext context = new KatmanContext();
        public bool Add(T data)
        {
        try 
        {	        
        context.Set<T>().Add(data);
             //context.SaveChanges();
             //return true; 
                    
            //if (context.SaveChanges() > 0)
            //    return true;
            //else 
            //return false;

            return context.SaveChanges()>0 ? true : false;
        }
        catch (Exception ex)
        {
        return false;
        } 
        }

     Save Changes metodu int döner eğer 1 den büyükse true olarak dönsünTernary if kullanalım.
        public bool Delete(int id)
        {
            try
            {
                //context.Set<t>().Remove(context.Set().Find(id));
                //var siinecekData=    context.Set().Find(id);
                //context.Set<t>().Remove(siinecekData);
                T siinecekData=    context.Set().Find(id);
                context.Set<t>().Remove(siinecekData);
                //context.SaveChanges();
                return context.SaveChanges() > 0 ? true : false;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        public bool SoftDelete (T data)
        {
           try
            {
                context.Entry<t>(data).State = System.Data.Entity.EntityState.Modified;
                return context.SaveChanges() > 0 ? true : false;
            }
            catch (Exception ex)
            {
                return false;
            }
             
        }
    
        public bool Update(T data)
        {
            try
            {
                context.Entry<t>(data).State = System.Data.Entity.EntityState.Modified;
                return context.SaveChanges() > 0 ? true : false;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
        public List<t> GetAll() 
        {
            return context.Set<t>().ToList();
        
        }
        public T GetById(int id)
        {
            return context.Set<t>().Find(id);
        }
        public List<t> GetByFilter(Expression<func<t, bool>> filter)
        {
            return context.Set<t>().Where(filter).ToList();
        }

        public List<e_blog> GetBlog(int id)   //blog id sini vereceğiz
        {
          return  context.Tbl_Blog.Where(x => x.BlogID == id).ToList(); // x öyleki öyle bir blogid getir bana idye eşit olsun
             
        }


    public class CityRepository:BaseRepository<E_City>
     {
       public  List<E_City> GetirCity(int id)
       {
          return context.Tbl_City.Where(x => x.CityID == id).ToList();
 
       }
    }

Tüm business logic layerlar uygulanır. Şimdi sıra UI de ekleyip çıkarmalıyız.

Entity Frame work yüklenmezse;
    packages.config oluşturup
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
    </configuration> 

app.config de ise;
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="KatmanContext" connectionString="data source=.;initial catalog=Katman.Dal.EntityFramework.KatmanContext;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
  </connectionStrings>
</configuration>

Not: Eğer Sql inizden veritabanı export etmek isterseniz. Bulunduğu veritabanına - Sqğ click-Task-Backup seçeneğini işaretleyin. .bak uzanılı dosya sağlayacaktır bunu eklemek istediğinizde. Database-restore database -devicedan .bak dosyanızı seçip veritabanını seçin ve entegre edin.

Not: Performans yüksek olsun diye unity of Work kullanıız. Tüm işlemi yapsın en son save etsin. Server taraında stroed prosedür de oluşturup daha hızlı verim kazanabilirsin.
Not: Bir web sayfanın açılmaı için neler yapılması gerekir?

Web sayfası nedir? Web sayfası, web üzerinde yer alan web sitelerindeki bilgilerin düzenli biçimde kullanıcılara sunulabilmesi için oluşturulmuş sayfalardır. Bir web sitesi için Temel HTML, CSS, JavaScript bilgisi , Alan Adı (Domain) ,Barındırma Hizmeti (Hosting),FTP İstemcisi En popüler FTP istemcileri FileZilla ve WinSCP

02.02.2020