שינוי הקוד המיוצר על ידי Entity Framework

29 באפריל 2015

תגיות: , ,
תגובה אחת

כשאנחנו משתמשים ב – Entity Framework,  לפעמים נרצה לשנות את ה – Auto Generated Code שהוא יוצר עבורנו, לדוגמא – אם ה – EF שלנו נראה כך:

image

 

הקוד שנוצר אוטומטית, נראה כך:

Code Snippet
public partial class BGPEntities : DbContext
{
    public BGPEntities()
        : base("name=BGPEntities")
    {
    }
   
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }
   
    public virtual DbSet<City> Cities { get; set; }
    public virtual DbSet<LoginHistory> LoginHistories { get; set; }
    public virtual DbSet<User> Users { get; set; }
}

 

מה קורה במידה ואנחנו רוצים לשנות את הקוד שנוצר, לדוגמה – למחלקה DbSet יש מתודה בשם Add, שבעזרתה אנחנו מוסיפים לטבלה אובייקטים חדשים,  אם נרצה בכל פעם לפני הוספה אובייקט חדש לבצע קוד או ולידציה מסויימת.

כדי לעשות זאת נרצה לרשת מ – DbSet ולדרוס את מתודת Add, העניין שנצטרך ראשית לגרום ל-  Auto Generated Code ליצור קוד אחר.

הסוד טמון בקובץ ה – tt שנוצר, הוא ממומש בשפת T4 (כתבתי עליה בעבר).

image

 

נחפש בקובץ את המקום בו יוצרים את הקוד עבור ה – DbSet, ונשנה למחלקה שלנו, זה נראה ככה:

Code Snippet
public string DbSet(EntitySet entitySet)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} virtual DbSet<{1}> {2} {{ get; set; }}",
        Accessibility.ForReadOnlyProperty(entitySet),
        _typeMapper.GetTypeName(entitySet.ElementType),
        _code.Escape(entitySet));
}

נשנה ל – MyDbSet

Code Snippet
public string DbSet(EntitySet entitySet)
{
    return string.Format(
        CultureInfo.InvariantCulture,
        "{0} virtual MyDbSet<{1}> {2} {{ get; set; }}",
        Accessibility.ForReadOnlyProperty(entitySet),
        _typeMapper.GetTypeName(entitySet.ElementType),
        _code.Escape(entitySet));
}

 

כעת הקוד שיג’ונרט ייראה כך:

Code Snippet
public partial class BGPEntities : DbContext
{
    public BGPEntities()
        : base("name=BGPEntities")
    {
    }
   
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }
   
    public virtual MyDbSet<City> Cities { get; set; }
    public virtual MyDbSet<LoginHistory> LoginHistories { get; set; }
    public virtual MyDbSet<User> Users { get; set; }
}

 

המחלקה שניצור, נוכל לכתוב קוד כמו הקוד הבא:

Code Snippet
public class MyDbSet<T> :DbSet<T> where T : class
{
    public override T Add(T entity)
    {
        // your custom code…

        return base.Add(entity);
    }
}

 

כמובן באותה צורה נוכל לשנות את הקוד שנוצר עבור כל מחלקה.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

תגובה אחת

  1. דוד30 באפריל 2015 ב 11:51

    יפה, בדיוק ראיתי על זה פה http://code.613m.org/viewtopic.php?f=1&t=634, בנושא ערכי ברירת מחדל למאפיינים.

    הגב