عنوان:

‫چگونگی تعریف خاصیتی از نوع Enum در EF Code First


نویسنده: ایلیا اکبری فرد
تاریخ: ۱۳۹۱/۰۵/۱۴ ۰:۵۱
آدرس: www.dntips.ir
فرض می‌کنیم که یک Enum بصورت زیر داریم :
[Flags]
public enum Gender : byte
{
     None=0, Male=1, Female=2,
};
حال می‌خواهیم از این Enum در یک مدل ساده استفاده کنیم. از آنجا که EF هنوز قادر به ‍‍‍‍‍‍‍‍‍‍پشتیبانی از Enum نمی‌باشد باید به روش زیر عمل کنیم:
1) توسط data Annotation
public class User
{
    public int UserId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Username { get; set; }

    [Column(Name="Gender")]
    public int InternalGender { get; set; }
    [NotMapped]
    public Gender Gender
    {
        get { return (Gender)this.InternalGender; }
        set { this.InternalGender = (int)value; }
    }

    public DateTime DateOfBirth { get; set; }
}
2) توسط Fluent API
 modelBuilder.Entity<Participant>().Ignore(p => p.Gender);
 modelBuilder.Entity<Participant>().Property(p => p.InternalGender).HasColumnName("Gender");

نظرات

  • مهمان در ۱۳۹۱/۰۷/۰۶ ۲۱:۱۰
    ممنون مطلب مفیدیه. فقط یه سوال: ما اگر یه سری Enum مثلاً برای Priority داشته باشیم، بعد بخوایم در زمان استفاده توی UI به صورت فارسی نمایش داده بشه باید چکار کرد؟
  • اردلان شاه قلی در ۱۳۹۱/۰۸/۲۰ ۲۳:۵۶
    سلام.
    بسیار سپاسگزارم از زحمات شما.
    در خصوص کد فوق یک سوال داشتم.
    در قسمت تعریف خصوصیات مطابق کد زیر
    [Column(Name="Gender")] 
    در هنگام کامپایل برنامه با خطای زیر روبرو می‌شوم.
    'System.ComponentModel.DataAnnotations.Schema.ColumnAttribute' does not contain a definition for 'name'
     
     
    • وحید نصیری در ۱۳۹۱/۰۸/۲۱ ۱۰:۳۶
      Column در اسمبلی EntityFramework.dll تعریف شده؛ هرچند فضای نام آن در اصل متعلق به اسمبلی EF نیست.

    • شاهین کیاست در ۱۳۹۱/۰۸/۲۱ ۱۱:۱۵
      به کمک ReSharper فضای نام‌ها و اسمبلی هایی که از قلم افتاده را سریعتر پیدا می‌کنید.
  • کیا در ۱۳۹۱/۰۸/۲۱ ۱۴:۵۰
    بهترین راه برای تعریف Enum در بانک و البته در راستای استفاده از اون در ef CodeFirst چیه؟
    1. تعریف جدول بصورت id, title (که مثلا id دقیقا مقدار متناظر با چیزی که سمت کلاینت برای enum در نظر گرفتیم باشه) و سپس سمت ef CF مثل یک جدول معمولی باهاش کار بشه؟
    2. تعریف اعداد در یک جدول و map کردن با مقدار متناظر enum در سمت کلاینت؟
    3. راه دیگه ای؟
    خودتون با enum‌ها به چه صورت برخورد می‌کنید و کار می‌کنید
    اگر ممکن است زیر ef5 صحبت کنید چون اون خودش enum support داره ولی بعضیا هنوز مثل من مجبورن زیر نسخه 5 کار کنن