我如何使用方法而不是硬编码(使用 Entity Framework)向实体添加属性?

How would I add properties to an entity using a method instead of hard coding it (using Entity Framework)?

我正在使用 Entity Framework 来帮助存储我用 C# 编写的一些实体,以创建一个简单的 Web 应用程序。我想知道如何将 属性(字段)添加到实体而不将其编码到实体 class 中。以我的员工实体为例:

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 应用程序添加 属性,这意味着它不能只是硬编码。我想象的是有一个 "Add Property" 按钮,当用户点击它时,他们必须:

我对所有这一切都是陌生的,所以请耐心等待,但我不能直观地编写一个方法来接收实体的用户输入、属性 名称和类型,以及属性 的值,然后将其添加到该实体以使其成为 属性,就像实体 class 中硬编码的其他属性一样。如果有人对如何在 运行 时间添加持久属性并将它们链接到实体以便它们的功能就像在实体 class 中编码一样像原始的一样,我将非常感激特性。

我有一种方法允许用户编辑 "Office" 实体 (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);
}

然而,我不是简单地编辑其中一个属性的值,而是询问如何编辑实体以便添加一个全新的 属性 + 值。我希望我的 post 足够清楚。

我不明白这是怎么可能的,就像你描述的那样。

如果我需要这种 "extensible" 实体要求,用户可以在其中动态添加新属性,我会为此目的创建几个通用 tables + 实体。它看起来像这样:

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 table。如果用户为这些属性分配新值,则您将行添加到 ExtraEntityPropertyValue。

就我个人而言,我不是这些通用解决方案的忠实拥护者,因为如果您可以提前静态预定义类型和属性,就会失去很多类型安全性。但如果你真的需要充满活力,那么也许你可以采纳这个想法并让它为你所用。