در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش Entity Framework قسمت 4 : تعریف Mapping با Fluent API

بخش چهارم از سری مقالات آموزشی Entity Framework Code-First را شروع می کنیم. در قسمت قبل نحوه تغییر Mapping را با استفاده Attribute ها بررسی کردیم. در این بخش قصد دارم تا در مورد Fluent-API در Code-First بنویسم.ابتدا بهتر است در مورد Fluent-API بیشتر توضیح بدهم. بر اساس توضیح سایت Wikipedia، مفهوم Fluent API یا Fluent Interface به معنی پیاده سازی API شی گرا می باشد که قابلیت خوانایی آن را افزایش می دهد.این مفهوم دقیقا" در مورد Entity Framework Code-First نیز صدق می کند. بدین معنی که شما می توانید دستور های Mapping را به صورتی بنویسید که قابلیت خوانایی و درک آن بالاتر برود.برای تعریف Mapping با کمک Fluent API می توان به دو صورت عمل کرد:

  1. نوشتن دستورات در متد OnModelCreating
  2. ایجاد یک کلاس جداگانه برای Map و اضافه کردن آن به کلاس Context

برای استفاده مورد اول، متد OnModelCreating را که یک متد virtual هست، در کلاس Context باید Override کنیم، پارامتر این متد یک شئ از نوع DbModelBuilder هست. بوسیله متد های این شئ ما می توانیم عملیات Mapping را انجام دهیم. در ادامه به بررسی متد های زیر از شئ DbModelBuilder می پردازیم:

  1. متد Entity
  2. متد ToTable
  3. متد Property
  4. متد HasColumnName
  5. متد HasColumnType
  6. متد HasDatabaseGeneratedOption
  7. متدهای IsRequired و IsOptional
  8. متد IsMaxLength
  9. متد HasMaxLength
  10. متد HasKey
  11. متد Ignore

متد Entity

در حقیقت این متد انتخاب کننده کلاسی هست که می خواهیم عملیات Mapping را برای آن انجام دهیم، نوع جنریک این متد باید از نوع کلاسی باشد که عملیات Mapping برای آن انجام می شود، نوع برگشتی این متد از نوع EntityTypeConfiguration است که بوسیله متد های آن می توانیم عملیات Mapping مربوط به آن Entity را انجام دهیم.

متد ToTable

این متد که در کلاس EntityTypeConfiguration تعریف شده است، تعیین کننده جدول معادل کلاس در بانک اطلاعاتی است:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity().ToTable("MyTable");
}

Attribute معادل: TableAttribute

متد Property

برای تغییر Mapping یک خصوصیت، از این متد استفاده می کنیم، در این حقیقت این متد Selector خصوصیت می باشد و نوع برگشتی آن بر اساس نوع خصوصیت انتخابی فرق می کند. برای مثال با انتخاب یک خصوصیت از نوع رشته، نوع برگشتی این متد از نوع StringPropertyConfigurator یا برای خصوصیات از نوع عددی از نوع PrimitivePropertyConfigurator می باشد. برای مثال، انتخاب خصوصیت FirstName از کلاس Customer:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity().Property(customer => customer.FirstName)
}

متد HasColumnName

بوسیله این متد می توان نام ستون معادل یک خصوصیت را بانک اطلاعاتی مشخص کرد، برای مثال، در زیر خصوصیت FirstName به ستون FName و خصوصیت LastName به ستون LName اشاره خواهد کرد:

    modelBuilder.Entity().Property(customer => customer.FirstName).HasColumnName("FName");
    modelBuilder.Entity().Property(customer => customer.LastName).HasColumnName("LName");

Attribute معادل: ColumnAttribute

متد HasColumnName

بوسیله این متد می توان نوع ستون معادل خصوصیت انتخاب شده در بانک اطلاعاتی را مشخص کرد:

modelBuilder.Entity().Property(customer => customer.FirstName).HasColumnType("varchar");

Attribute معادل: ColumnAttribute

متد HasDatabaseGeneratedOption

اگر ستون معادل خصوصیت انتخابی در بانک، از نوع Identity یا Computed باشد، بوسیله این متد می توان این مورد را به Entity Framework شناساند:

modelBuilder.Entity().Property(customer => customer.CustomerID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

متد های IsRequired و IsOptional

بوسیله این دو متد می توان نوع ستون را که مقدار Null قبول می کند یا خیر مشخص کرد:

  1. IsRequired: ستون مقدار Null قبول نمی کند.
  2. IsOptional: ستون مقدار Null قبول می کند.

    modelBuilder.Entity().Property(customer => customer.FirstName).IsRequired();
    modelBuilder.Entity().Property(customer => customer.LastName).IsOptional();

متد IsMaxLength

این متد تعیین می کند که یک خصوصیت از نوع رشته باید خداکثر طول وارد شده را قبول کند، معادل MAX برای نوع های varchar و nvarchar در بانک اطلاعاتی:

    modelBuilder.Entity().Property(customer => customer.LastName).IsMaxLength();

متد HasMaxLength

بوسیله این متد می توان طول قابل قبول برای یک ستون را مشخص کرد:

modelBuilder.Entity().Property(customer => customer.FirstName).HasMaxLength(2000);

در صورت دادن مقدار null به ورود این متد، هیچ محدودیتی برای طول در نظر گرفته نخواهد شد.

*توجه کنید که متدهای IsMaxLength و HasMaxLength تنها برای خصوصیات از نوع رشته قابل استفاده هستند.

Attribute معادل: MaxLengthAttribute

متد HasKey

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

modelBuilder.Entity().HasKey(customer => customer.CustomerID);

Attribute معال: KeyAttribute

متد Ignore

بوسیله این متد می توان گفت که یک خصوصیت به هیچ ستونی در بانک اشاره نمی کند:

modelBuilder.Entity().Ignore(customer => customer.FullName);

Attribute معادل: NotMappedAttribute

استفاده از قابلیت Method Chaining

با استفاده از این قابلیت دیگر نیازی نیست برای هر مورد از تعریف ها برای یک خصوصیت یک خط جدا بنویسیم، به دلیل اینکه مقدار برگشتی اکثر متدها از نوع PropertyConfigurator است، می توان پس از یک دستور، دستور بعدی را نیز نوشت:

modelBuilder.Entity().Property(customer => customer.FirstName)
    .HasColumnName("FName")
    .IsRequired()
    .HasMaxLength(2000)
    .HasColumnType("varchar");

با این روش، در زمان صرفه جویی خواهیم کرد.

تا اینجای کار با برخی از متد ها آشنا شدیم، اما ممکن است بعضی وقت ها، Model ما خیلی بزرگ باشد، برای مثال از 100 کلاس مختلف تشکیل شده باشد. در این جور مواقع بهتر است که یک کلاس جداگانه برای تعریف Mapping ها بنوسیم و سپس کلاس Mapping را به کلاس Context اضافه کنیم. برای این کار ابتدا یک کلاس تعریف می کنیم که از کلاس EntityTypeConfiguration مشتق شده باشد، نوع جنریک را از نوع کلاس مورد نظر انتخاب می کنیم، سپس داخل Constructor کلاس دستورات Mapping را می نویسیم:

public class CustomerMap : EntityTypeConfiguration
{
    public CustomerMap()
    {
        HasKey(customer => customer.CustomerID);
        Property(customer => customer.FirstName)
            .HasColumnName("FName")
            .HasColumnType("varchar")
            .IsRequired()
            .HasMaxLength(2000);
        Property(customer => customer.LastName)
            .HasColumnName("LName")
            .IsOptional()
            .IsMaxLength();
    }
}

حالا این کلاس را می توانیم بوسیله دستور زیر به کلاس Context اضافه کنیم:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Configurations.Add(new CustomerMap());
}

در بخش بعدی چگونگی تعریف رابطه ها بوسیله Attribute ها و Fluent API را بررسی خواهیم کرد.

موفق و پیروز باشید.
#آموزش_سی_شارپ #ایجاد_جدول_با_entity_framwork #entity_framework_چیست؟ #مشکل_entity_framework #آموزش_entity_framework_code_first #نمایش_اطلاعات_ویو_ها_در_entity_framework #اموزش_برنامه_نویسی_entity_framework #آموزش_entity_framework
عنوان
1 آموزش Entity Framework قسمت 1 : معرفی و شروع به کار رایگان
2 آموزش Entity Framework قسمت 2 : کلاسهای DbContext و DbSet رایگان
3 آموزش Entity Framework قسمت 3 : تعریف Mapping با Attribute ها رایگان
4 آموزش Entity Framework قسمت 4 : تعریف Mapping با Fluent API رایگان
5 آموزش Entity Framework قسمت 5 : تعریف رابطه ها بخش 1 رایگان
6 آموزش Entity Framework قسمت 6 : تعریف رابطه ها بخش 2 رایگان
زمان و قیمت کل 0″ 0
7 نظر
mr_rostami

بسیاااااااار بسیاااااااااااااار عالی بود استاد واقعا خسته نباشی ;-)

ابوالفضل رهنما

سلام

مهندس در Attribute ها

خصوصیت زیر را داریم

 [DisplayName("id")]
public int Id { get; set; }

آیا در fluentapi این خصوصیت را داریم و باید دراین مورد از Attribute استفاده کنیم

سبحان مظفری

سلام من با اتریبوت ها میتونم Error messange رو پیاده سازی کنم ولی با Flount Api نمیتونم

ممنون میشم کمکم کنی؟؟؟

حسین احمدی

سلام، مشکلتون چیه؟ پیغام خطایی دریافت می کنید؟ راجع به مشکلتون بیشتر توضیح بدید، سوالتون خیلی کلی هست!

سبحان مظفری

با سلام ممنون از پاسخ شما

کد زیر رو در نظر بگیرد

[Display(Name = " نام")]

[Required(ErrorMessage = "{0}را وارد کنید")]

[MaxLength(10, ErrorMessage = "{0} باید کمتر از 10 کاراکتر باشد")]

[MinLength(3, ErrorMessage = "{0} حداقل مقدار کارکتر باید 3 باشد")]

public string Name { get; set; }

الان من میخوام این اتریبیوت ها رو تو فلونت ای پی ایی پیاده سازی بکم

مشکل اینجاس ک من تو فلوند نمیاونم Error Messsage رو پیاده سازی کنم یعنی مثلا وقتی کاربر فیلدو خالی گزاشت ی خطایی ک خودم بهش میدم رو نشون بده

امیدوارم منظورم رو رسونده باشم

باتشکر

حسین احمدی

سلام مجدد، شما بوسیله Fluent API تنها می تونید Required و مقدار MaxLength رو مشخص کنید، مشخص کردن ErrorMessage تنها بوسیله Attribute ها امکان پذیر هست.

سبحان مظفری

مچکر از شما

پس من باید برای هر کلاس یه View Model تعریف میکنم Attribute ها رو هم اونجا مینوسم تو Fluent API فقط ارتباطات و کارایی که میشه انجام داد رو مینویسم

خیلی ممنون

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....