3

我在代码优先样式中使用 EF4.1 来为 SQL Azure DB“MyAppsDB”中的基于 ASP.NET MVC 3 的小型 webapp 保留 POCO 对象。当这些表不存在时,它们会在 MyAppsDB 中自动创建。我想在 SQL Azure 上托管应用程序,但我不想为额外的 1GB 数据库支付 10 美元/月来存储 50MB 的会话状态,并且使用缓存会更加昂贵。

我想将会话状态与我的应用程序模型一起存储在 MyAppDB 中。有没有办法做到这一点?如果会话表不存在,我可以自动创建它吗,与 EF 代码优先模型相同吗?

我试过修改我的 web.config 如下:

<sessionState mode="Custom" customProvider="DefaultSessionProvider">
  <providers>
    <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
      connectionStringName="MyAppDBContext" applicationName="/" />
  </providers>
</sessionState>

但它抱怨会话表不存在。如果我创建会话表,EF4.1 会抱怨数据库元数据不符合其预期。

4

1 回答 1

2

当然可以将现有的 SQL Azure 数据库用于会话状态。我正在这样做(并且出于完全相同的原因)。标准脚本不起作用,因为它们与 SQL Azure 不兼容。在某个地方有一些更新的脚本(我不记得在哪里,但我会有一个谷歌),我用来设置数据库。

不过,这不是代码优先。您可能能够对架构进行逆向工程,但涉及到许多存储过程。

请注意,您还需要考虑整理过期的会话。有一个需要定期运行的存储过程(我认为是 DeleteExpiredSessions),典型的建议是从 Worker Role 运行它。但是您不会为了定期运行存储过程的唯一目的而部署 Worker 角色!

编辑:在此页面上找到脚本。请注意,主要文章中发布的脚本存在问题,但在 Peter McEvoy 的评论中,页面下方有一个修改过的脚本。

有些人建议优先使用 Azure 表存储会话状态提供程序,如果我还没有使用 SQL Azure,我会倾向于同意。但是我在使用 Azure 提供程序时遇到了问题(特别是在开发环境中),但是一旦部署了更新的脚本,使用 SQL Server 会话状态就完全没有问题了。

编辑 2:我已经取得了进一步的进展,我会为我的博客写下它并在此处发布链接。

亮点,不过是:

  • 针对空数据库运行 InstallSqlState.SQL 脚本(针对 Azure 的修改脚本)
  • 使用 EF Power Tools 将 ASP 状态表逆向工程为 EF Code-First
  • 将逆向工程类集成到您的模型和上下文中
  • 修改 ASPStateTempSessions 表的映射以使用 Image 列类型
  • 从只创建存储过程的 InstallSqlState.SQL 创建一个新的 SQL 脚本
  • 修改存储过程以始终指定默认值
  • 在 Initializer Seed() 方法中添加一些代码以运行 SQL 脚本

我想就是这样,但是当我写完它时,我会在我的博客上给出更完整的描述。

编辑3:

我的文章的第一部分现在在我的博客上。第二部分即将推出(但现在该睡觉了)。

编辑4:

第二部分也写好了,现在。

于 2011-08-10T18:29:27.517 回答