有没有一种从数据库存储枚举的好方法?

时间:2009-08-29 21:45:14

标签: asp.net .net

我是ASP.NET新手,有WinForms和WPF经验。放轻松我。

当我的页面加载时,它会访问数据库并查询表格以选择放入下拉列表。现在,如果您在页面上进行回发,是否重新加载form_load中的值?似乎没必要两次点击数据库。我的假设是我把form_load,我点击数据库中的枚举,然后用我找到的值填充下拉列表。

4 个答案:

答案 0 :(得分: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
        }
    }
}

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

编辑:

对于诸如PaymentStatus之类的枚举,这些枚举很少或者从来没有将c#枚举映射到具有相同数值的目录,正如Randolpho所说的那样。对于其他人在HttpRuntimeCache对象中缓存(“缓存”)并将绝对过期或者放入SqlDependency

答案 3 :(得分:1)

我假设你在谈论一个“查找表”,基本上是一个具有{Id,Name}模式并且从另一个表引用为外键的东西,对吗?

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

如果您的枚举可能完全改变(可能由管理用户控制),您将无法使用@Andrei Rinea的建议,因为您需要刷新数据库中的值。最终,你会做得最好,就像Keltex建议的那样,并以短暂的过期缓存结果 - 可能只需要5分钟。如果您负载很重,那么少量缓存可以提高性能。

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

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