何时加载设置表

时间:2018-03-04 00:48:38

标签: asp.net entity-framework asp.net-core-mvc entity-framework-core

我有一个使用asp.net MVC Core的Web应用程序,以及实体框架核心。该应用程序的一部分有一个简单的设置表。这只是一个表,只有一个记录,其中包含许多字段,因此管理员可以轻松更改Web应用程序的工作方式。

设置表被加载到静态“设置”类中,因此应用程序中的任何位置都可以读取它(视图和控制器)

我想知道的是何时或如何加载它的最佳位置。目前我在Startup.Configure中加载它,然后设置了路由。

在大多数情况下,这很好用。但是,如果我在设置表中添加一个字段,则无法迁移(我首先使用代码)。我收到有关无效字段的错误。通常,错误如下所示:

An error occurred while calling method 'BuildWebHost' on class 'Program'. Continuing without the application service provider. Error: One or more errors occurred. (Invalid column name 'EmailApiKey'.
Invalid column name 'EmailBaseUrl'.
Invalid column name 'EmailSenderAddress'.
Invalid column name 'EmailSenderDomain'.
Invalid column name 'EmailSenderName'.)
Unable to create an object of type 'ApplicationDbContext'. Add an implementation of 'IDesignTimeDbContextFactory<ApplicationDbContext>' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

为了解决这个问题,我必须删除加载安装表的代码。

这让我觉得这不是加载设置的最佳位置/方式(看起来好像它阻碍了数据库迁移)。

那么 - 有更好的方法吗?基本上,我想:

  • 首次启动应用时加载一次设置表。
  • 在应用程序(视图和控制器)的任何位置都可以访问它。
  • 如果用户更改了设置,则应自动更新静态版本。

1 个答案:

答案 0 :(得分:0)

我会在第一次访问时而不是在应用程序启动时加载设置。一个优点是,如果延迟加载失败,您只需在下次访问时再试一次。

  

如果用户更改了设置,则应自动更新静态版本。

您可以将其缓存在ASP.NET缓存或MemoryCache中。您可以设置过期时间,以便在用户进行更改时定期刷新。或者,如果设置在SQL Server数据库中,则可以使用the SqlCacheDependency class