21
03
خب برای اینکار کافیست روی سولوشن بخش core رایت کلیک کرده و فولدری تحت عنوان Mappings ایجاد کنیم و در این فولدر تمامی کلاس های مپ شده را نگهداری کنیم. برای شروع نیز مپِ کلاس مربوط به Post را ایجاد می کنیم. بر روی این فولدر رایت کلیک کرده وکلاس جدیدی تحت عنوان PostMap ایجاد می کنیم و کدهای زیر را در ان می نویسیم :
کدهای کلاس PostMap
using FluentNHibernate.Mapping;
using JustBlog.Core.Objects;
namespace JustBlog.Core.Mappings
{
public class PostMap : ClassMap<Post>
{
public PostMap()
{
Id(x => x.Id);
Map(x => x.Title)
.Length(500)
.Not.Nullable();
Map(x => x.ShortDescription)
.Length(5000)
.Not.Nullable();
Map(x => x.Description)
.Length(5000)
.Not.Nullable();
Map(x => x.Meta)
.Length(1000)
.Not.Nullable();
Map(x => x.UrlSlug)
.Length(200)
.Not.Nullable();
Map(x => x.Published)
.Not.Nullable();
Map(x => x.PostedOn)
.Not.Nullable();
Map(x => x.Modified);
References(x => x.Category)
.Column("Category")
.Not.Nullable();
HasManyToMany(x => x.Tags)
.Table("PostTagMap");
}
}
}
اگر SQL کار کرده باشید میدانید که کدهای بالا چه مفهومی دارند اما برای دوستانی که عادت به این نوع کدها ندارند باید عرض کنم که نترسید. :دی
نکته : به صورت پیشفرض نام پراپرتی به عنوان نام جدول و ستون شناخته می شود. اگر بخواهید این مورد را تغییر دهید و نام دیگری جایگزین کنید کافیست از کد زیر استفاده نمایید :
Table("tbl_posts");
یعنی در اینجا
Map(x => x.Title).Column("post_title")
اینگونه خواهد شد. حالا به سراغ مپ دو کلاس دیگر می رویم.
Extension Method
جت آشنایی و کاربردهای بیشتر اکستنشن متد ها پیشنهاد می کنیم حتماً ریفرنس زیر را مشاهده نمایید
https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping
اینگونه خواهد شد. حالا به سراغ مپ دو کلاس دیگر می رویم.
کدهای کلاس CategoryMap
using FluentNHibernate.Mapping;
using JustBlog.Core.Objects;
namespace JustBlog.Core.Mappings
{
public class CategoryMap : ClassMap<Category>
{
public CategoryMap()
{
Id(x => x.Id);
Map(x => x.Name)
.Length(50)
.Not.Nullable();
Map(x => x.UrlSlug)
.Length(50)
.Not.Nullable();
Map(x => x.Description)
.Length(200);
HasMany(x => x.Posts)
.Inverse()
.Cascade.All()
.KeyColumn("Category");
}
}
}
کدهای کلاس TagMap
using FluentNHibernate.Mapping;
using JustBlog.Core.Objects;
namespace JustBlog.Core.Mappings
{
public class TagMap : ClassMap<Tag>
{
public TagMap()
{
Id(x => x.Id);
Map(x => x.Name)
.Length(50)
.Not.Nullable();
Map(x => x.UrlSlug)
.Length(50)
.Not.Nullable();
Map(x => x.Description)
.Length(200);
HasManyToMany(x => x.Posts)
.Cascade.All().Inverse()
.Table("PostTagMap");
}
}
}
تا اینجا ما مپ ها را نیز ایجاد کردیم. حال وقتش رسیده تا از الگوی مخزن ( Repository pattern ) بهره ببریم. ما در اینجا از Repository pattern جهت دسترسی به دیتابیس استفاده خواهم کرد. برای دسترسی به کدهای دیتابیس نیاز به کنترلر داریم . هسته ی اصلی ریپازیتاری یا مخزن داده شامل تمامی تعاریف از دیتابیس و دسترسی به داده ها می باشد. همچنین شامل تمام دستورها و روش هایی برای دسترسی به دیتابیس و داده را نیز شامل می شود. Repository pattern اساسا یک میانجی بین دو لایه است. عمدتا جایی استفاده می شود که نیاز است داده ها قبل از رفتن به مرحله بعد تغییر کنند. برای آشنایی بیشتر به عکس زیر نگاه بیاندازید.
Repository pattern
در عمل Repository یک واسطه است بین Domain و لایه ای که سبب آن المانهای دیتابیس مانند جداول به وسیله آن در محیط کدنویسی شناخته شده اند و مانند یک مجموعه از Domain Object ها عمل میکند.
بریم سراغ ایجاد ریپازیتاری برای پروژه. برای ایجاد یک ظاهر یا interface در جایی که دو متد تعریف شده اند عمل می کنیم. یعنی در بخش Core اقدام به ایجاد IBlogRepository می نماییم.
برای این کار برروی Core رایت کلیک کرده و کلاس جدیدی با همین نام ایجاد می کنیم و کدهای زیر را در ان قرار می دهیم.
کدهای کلاس IBlogRepository
using JustBlog.Core.Objects;
using System.Collections.Generic;
namespace JustBlog.Core
{
public interface IBlogRepository
{
IList<Post> Posts(int pageNo, int pageSize);
int TotalPosts();
}
}
حال نیاز به اینترفیسی برای این کلاس داریم . کلاسی ایجاد و نام ان را BlogRepository می نامیم. از این کلاس برای انجام امور مربوط به اینترفیس بهرهمند خواهیم شد!
کدهای کلاس BlogRepository
using JustBlog.Core.Objects;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.Linq;
using NHibernate.Transform;
using System.Collections.Generic;
using System.Linq;
namespace JustBlog.Core
{
public class BlogRepository : IBlogRepository
{
// NHibernate object
private readonly ISession _session;
public BlogRepository(ISession session)
{
_session = session;
}
public IList<Post> Posts(int pageNo, int pageSize)
{
var posts = _session.Query<Post>()
.Where(p => p.Published)
.OrderByDescending(p => p.PostedOn)
.Skip(pageNo * pageSize)
.Take(pageSize)
.Fetch(p => p.Category)
.ToList();
var postIds = posts.Select(p => p.Id).ToList();
return _session.Query<Post>()
.Where(p => postIds.Contains(p.Id))
.OrderByDescending(p => p.PostedOn)
.FetchMany(p => p.Tags)
.ToList();
}
public int TotalPosts()
{
return _session.Query<Post>().Where(p => p.Published).Count();
}
}
}
NHibernate ISession
ISession مدیریت تداوم اینترفیس را بر عهده دارد و برای ذخیره سازی و بازیابی اطلاعتی که از سمت پایگاه داده ارسال می شوند کاربرد دارد
/پایان بخش اول گام سوم : آموزش برنامه نویسی وب سایت خبری توسط MVC.Net - ایجاد کلاسهای دسترسی داده و متد ها ( data access classes and methods ) /
دسترسی به دیگر بخش هاِ آموزش برنامه نویسی وب سایت
آموزش برنامه نویسی وب سایت خبری توسط MVC.Net - بخش اول گام اول
آموزش برنامه نویسی وب سایت خبری توسط MVC.Net- بخش اول گام دوم
آموزش برنامه نویسی وب سایت خبری توسط MVC.Net - بخش اول گام سوم
اگر دوست داشتید به اشتراگ بگزارید