2015-06-04 55 views
1

我正在使用實體框架來幫助存儲一些我用C#編寫的實體來創建一個簡單的Web應用程序。我想知道如何將一個屬性(字段)添加到一個實體,而無需將其編碼到實體類中。就拿我的員工實體,例如:如何使用方法將屬性添加到實體而不是硬編碼(使用實體框架)?

public class Employee : Person 
{ 
    public int OfficeID { get; set; } 
    public DateTime HireDate { get; set; } 
    public string JobTitle { get; set; } 
    public int Salary { get; set; } 

    public virtual Office Office { get; set; } 
} 

現在,讓我們說,我想員工的實體也有描述員工認證一個

string Certifications 

財產。我可以把它寫在我定義工資的路線下面。

不過,我需要能夠實現的功能,使用戶可以添加使用Web應用程序,這意味着它不能僅僅是硬編碼的屬性。什麼我想象的是,有一個「添加屬性」按鈕,當用戶點擊它,他們必須:

  • 到自己想要加的屬性選擇實體(如僱員實體)
  • 寫屬性的名稱以及它的類型(例如證書,字符串)
  • 寫此屬性的值(例如「正式認證爲OK程序員」)

我是新來的所有對此,請耐心等待,但對我而言,我可以編寫一種接受用戶輸入法的方法並不直觀t代表實體,屬性名稱和類型以及屬性值,然後將其添加到該實體中,使其成爲與實體類中硬編碼的其他屬性一樣的屬性。如果有人對如何在運行時添加持久屬性並將它們鏈接到實體上有任何建議,我會非常感激,因此它們的功能就好像它們是像實體類一樣在原始屬性中編碼。

我有一個方法,它允許用戶編輯了「辦公室」實體(credit to Tom Dykstra's Entity Framework 6 tutorial at asp.net)的屬性之一的值:

[HttpPost, ActionName("Edit")] 
[ValidateAntiForgeryToken] 
public ActionResult EditPost(int? id) 
{ 
    if (id == null) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
    var officeToUpdate = db.Offices.Find(id); 
    if (TryUpdateModel(officeToUpdate, "", 
     new string[] { "Address", "BusinessName" })) 
    { 
     try 
     { 
      db.SaveChanges(); 

      return RedirectToAction("Index"); 
     } 
     catch (DataException /* dex */) 
     { 
      //Log the error (uncomment dex variable name and add a line here to write a log. 
      ModelState.AddModelError("", "Unable to save changes. Try again, and if the problem persists, see your system administrator."); 
     } 
    } 
    return View(officeToUpdate); 
} 

然而,而不是簡單的編輯的屬性之一的值,我我問如何編輯實體,以便添加一個全新的屬性+值。我希望我的帖子夠清楚。

回答

3

我不明白你是如何描述它的確切方式。

如果我需要有這種「擴展」的實體要求,即用戶可以動態地添加新的特性,我想創建一個通用的情侶表+實體的,準確的目的。它會看起來像這樣:

public class ExtraEntityProperty 
{ 
    public int Id { get; set; } // PK 
    public string EntityName { get; set; } 
    public string PropertyType { get; set; } 
    public string PropertyName { get; set; } 
} 

public class ExtraEntityPropertyValue 
{ 
    public int Id { get; set; } // PK 
    public int ExtraEntityPropertyId { get; set; } // FK 
    public string PropertyValue { get; set; } 
} 

......這可能會更規範化一點,這取決於你如何使用它。

的這裏的一點是,這樣一來,你在數據方面完全處理,有事可以EF動態地爲你做。如果用戶需要動態添加新屬性,則可以將新行添加到ExtraEntityProperty表中。如果用戶爲這些屬性分配新值,則將行添加到ExtraEntityPropertyValue。我個人並不喜歡這些通用解決方案,因爲如果您可以提前靜態預先定義您的類型和屬性,那麼您將失去很多其他類型的安全性。但是,如果你真的需要充分發揮活力,那麼也許你可以採取這個想法並讓它爲你工作。

+0

感謝您花時間思考這個問題。我想我明白你在說什麼 - 我會嘗試類似於你所描述的內容,看看有沒有其他的東西。 – Drew

+0

對不起,我是使用堆棧溢出的新手。我怎麼做?我沒有看到接受答案按鈕或任何東西(如果這就是你正在談論的)。我也會upvote你的答案,但我沒有15聲望哈哈。編輯:它是分數下的勾號按鈕嗎?我只是點了那個 – Drew

相關問題