2009-08-29 88 views
2

我是ASP.NET新手,有WinForms和WPF经验。在我身上轻松一下。有没有从数据库中存储枚举的好方法?

当我的页面加载时,它会触碰数据库并查询表格以便将其放入下拉列表中。现在,如果您在页面上进行回发,您是否重新加载了form_load中的值?看起来没有必要打两次数据库。我的假设是我把form_load,我打到数据库的枚举,然后用我找到的值填充下拉列表。

回答

1

我假设你正在谈论一个“查找表”,基本上有一个架构为{Id,Name}并被作为另一个表中的外键引用的东西,是正确的吗?

这是一个古老的问题,没有“正确的”答案。

如果您的枚举可能完全改变(可能由管理员用户控制),您将无法使用@Andrei Rinea的建议,因为您需要刷新数据库中的值。最终,凯尔特克斯建议您最好不要做这样的事情,并在短时间内缓存结果 - 可能只需5分钟。如果您的负载很重,那么少量缓存可能会提高性能。

如果您的枚举不太可能改变......特别是如果它不能通过管理员的UI修改,那么我喜欢做一个有趣的技巧,即将枚举映射到实际的C#枚举, enum的值直接与枚举表的主键相关联。通过这种方式,您根本不必访问数据库以获取可能的值列表。

这个技巧的缺点是新的枚举项目需要新的编译代码和新的部署。这可能是也可能不是理想的,所以谨慎使用这个技巧。

1

这些可以在Application对象的应用程序启动时加载。我想他们不会经常改变。

然后从那里使用。对于这样的“目录”很少改变(每年或更少),我经常将它们硬编码为枚举类型。

编辑:

对于枚举如PaymentStatus或这样,其改变很少或从未映射到具有相同的数值的目录中的C#枚举,如Randolpho所述是确定。对于其他人缓存HttpRuntimeCache对象(“缓存”)并放置绝对到期或者SqlDependency

+0

似乎不太可靠。如果我的应用程序运行很长时间,并且枚举的更改频率比这更频繁? – MedicineMan 2009-08-29 21:50:16

+0

对于诸如PaymentStatus之类的枚举,很少或永远不会改变映射到具有相同数值的目录的c#枚举,因为Randolpho说没关系。对于其他人在HttpRuntimeCache对象(“Cache”)中缓存,并将绝对到期或SqlDependency – 2009-08-30 11:06:57

2

您可以使用Page.IsPostBack属性控制回发过程中调用的内容。它返回一个布尔值,指示页面在回发中的时间。例如:


public partial class _Default : System.Web.UI.Page { 
    protected void Page_Load(object sender, EventArgs e) { 
     if (!this.IsPostBack) { 
      // fill the enums 
     } 
    } 
} 

2

使用Cache对象并将数据库结果存储在缓存中。

相关问题