我如何使用方法而不是硬编码(使用 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" 按钮,当用户点击它时,他们必须:
- Select 他们要添加 属性 的实体(例如员工实体)
- 写下 属性 的名称及其类型(例如认证、字符串)
- 写入这个属性的值(例如"Officially certified as an OK programmer")
我对所有这一切都是陌生的,所以请耐心等待,但我不能直观地编写一个方法来接收实体的用户输入、属性 名称和类型,以及属性 的值,然后将其添加到该实体以使其成为 属性,就像实体 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。
就我个人而言,我不是这些通用解决方案的忠实拥护者,因为如果您可以提前静态预定义类型和属性,就会失去很多类型安全性。但如果你真的需要充满活力,那么也许你可以采纳这个想法并让它为你所用。
我正在使用 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" 按钮,当用户点击它时,他们必须:
- Select 他们要添加 属性 的实体(例如员工实体)
- 写下 属性 的名称及其类型(例如认证、字符串)
- 写入这个属性的值(例如"Officially certified as an OK programmer")
我对所有这一切都是陌生的,所以请耐心等待,但我不能直观地编写一个方法来接收实体的用户输入、属性 名称和类型,以及属性 的值,然后将其添加到该实体以使其成为 属性,就像实体 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。
就我个人而言,我不是这些通用解决方案的忠实拥护者,因为如果您可以提前静态预定义类型和属性,就会失去很多类型安全性。但如果你真的需要充满活力,那么也许你可以采纳这个想法并让它为你所用。