我是ASP.NET新手,有WinForms和WPF经验。在我身上轻松一下。有没有从数据库中存储枚举的好方法?
当我的页面加载时,它会触碰数据库并查询表格以便将其放入下拉列表中。现在,如果您在页面上进行回发,您是否重新加载了form_load中的值?看起来没有必要打两次数据库。我的假设是我把form_load,我打到数据库的枚举,然后用我找到的值填充下拉列表。
我是ASP.NET新手,有WinForms和WPF经验。在我身上轻松一下。有没有从数据库中存储枚举的好方法?
当我的页面加载时,它会触碰数据库并查询表格以便将其放入下拉列表中。现在,如果您在页面上进行回发,您是否重新加载了form_load中的值?看起来没有必要打两次数据库。我的假设是我把form_load,我打到数据库的枚举,然后用我找到的值填充下拉列表。
我假设你正在谈论一个“查找表”,基本上有一个架构为{Id,Name}并被作为另一个表中的外键引用的东西,是正确的吗?
这是一个古老的问题,没有“正确的”答案。
如果您的枚举可能完全改变(可能由管理员用户控制),您将无法使用@Andrei Rinea的建议,因为您需要刷新数据库中的值。最终,凯尔特克斯建议您最好不要做这样的事情,并在短时间内缓存结果 - 可能只需5分钟。如果您的负载很重,那么少量缓存可能会提高性能。
如果您的枚举不太可能改变......特别是如果它不能通过管理员的UI修改,那么我喜欢做一个有趣的技巧,即将枚举映射到实际的C#枚举, enum
的值直接与枚举表的主键相关联。通过这种方式,您根本不必访问数据库以获取可能的值列表。
这个技巧的缺点是新的枚举项目需要新的编译代码和新的部署。这可能是也可能不是理想的,所以谨慎使用这个技巧。
这些可以在Application对象的应用程序启动时加载。我想他们不会经常改变。
然后从那里使用。对于这样的“目录”很少改变(每年或更少),我经常将它们硬编码为枚举类型。
编辑:
对于枚举如PaymentStatus或这样,其改变很少或从未映射到具有相同的数值的目录中的C#枚举,如Randolpho所述是确定。对于其他人缓存HttpRuntimeCache对象(“缓存”)并放置绝对到期或者SqlDependency
您可以使用Page.IsPostBack属性控制回发过程中调用的内容。它返回一个布尔值,指示页面在回发中的时间。例如:
public partial class _Default : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
if (!this.IsPostBack) {
// fill the enums
}
}
}
使用Cache
对象并将数据库结果存储在缓存中。
似乎不太可靠。如果我的应用程序运行很长时间,并且枚举的更改频率比这更频繁? – MedicineMan 2009-08-29 21:50:16
对于诸如PaymentStatus之类的枚举,很少或永远不会改变映射到具有相同数值的目录的c#枚举,因为Randolpho说没关系。对于其他人在HttpRuntimeCache对象(“Cache”)中缓存,并将绝对到期或SqlDependency – 2009-08-30 11:06:57