0

我已将 SimpleMembership 添加到首先使用 EF 代码的 MVC4 应用程序中。

我想将几个用户作为种子数据添加到我的数据库中。当我第一次运行Update-Database时一切正常:我的用户和密码设置正确。

但是,当我尝试在我的 alpha 服务器(来自 Visual Studio)上运行它时,它不会添加我的用户。

为此,我发出命令

update-database -ConnectionString "<my alpha connection string>"

架构将被更新,但种子方法在不添加任何数据的情况下运行。

经过一番挖掘,我修改了我的种子方法:

if (!WebSecurity.Initialized)
    WebSecurity.InitializeDatabaseConnection("TestData", "UserProfile", "UserId", "UserName", true);

TestDataweb.config 文件中我的连接字符串的名称在哪里

至:

if (!WebSecurity.Initialized)
    WebSecurity.InitializeDatabaseConnection("<actualConnectionString>","System.Data.SqlClient", "UserProfile", "UserId", "UserName", true);

这将数据添加到我的 alpha 数据库中。

因此,当我发出Update-Database命令时,WebSecurity 似乎忽略了该连接字符串,只是尝试在本地执行此操作。

是否有我缺少的设置或选项?

编辑此播种是在 Configuration.cs Seed 方法中完成的。

4

1 回答 1

0

免责声明。可能会有一些事情让你绊倒,所以掷骰子......

Update-Database 设置要在迁移(UpDown方法)中使用的连接字符串,但它不会影响您“编译到”数据上下文或初始化 SimpleMembership 的任何连接字符串。

因此,您可以使用配置文件来指定连接字符串,以及一个appSettings带有连接字符串名称的条目,以便在任何时候使用(难以用语言解释,请跳到下面的解决方案以查看它的实际效果)。

然后,您为数据上下文配置 ctor,并调用初始化 SimpleMembership(为此我推荐一个帮助程序类)以从WebConfigurationManager.AppSettings["connStringName"].

完成此操作后,在调用之前Update-Database更改appSettings您需要的连接字符串名称的条目。然后,您可以依靠Update-Database开关-StartupProjectName(获取配置文件)和-ProjectName(获取迁移和播种)为您完成其余的工作。

(此解决方案还与使用构建配置名称更改配置文件以部署到远程服务器的 xml 转换很好地联系在一起,您可以在其中更改 appsettings 条目或连接字符串值。您不必使用它,因为从解决方案资源管理器视图发布用于发布的配置文件也可以为您更改连接字符串值。)

细节

希望以下内容描述您的设置:

  • 您的播种是在 configuration.cs 中完成的,即internal sealed class Configuration : DbMigrationsConfiguration<SomeDataContext>
  • SomeDataContext是一个public class SomeDataContext: DbContext
  • SomeDataContext

    • 指定连接字符串名称的构造函数,或
    • 默认构造函数,它查找与上下文类名称相同的连接字符串

Configuration.Seed使用 DbContext 的连接字符串,而不是您在 Update-Database 中指定的连接字符串。虽然后者用于迁移中的命令, SomeDataContext但它的连接字符串名称“已编译到其中”,因此 Update-Database 在运行时无法更改它。

此外,还有可能:

  • 您的用户是通过WebSecurityandMembership类方法添加的(正如您所说的,您正在使用 SimpleMembership)
  • SimpleMembership 是从您的Configuration.Seed方法使用初始化的WebSecurity.InitializeDatabaseConnection(希望,虽然您有多个地方来初始化它,但您使用单个类来保持它的 DRY 进行初始化,这样您对这个问题的解决方案变得更容易)

您的WebSecurity.InitializeDatabaseConnection调用指定了一个连接字符串名称,该名称再次编译到调用中,因此 Update-Database 无法更改它。

解决方案。

使用 app/web.config 指定连接字符串

一种可能的解决方案是通过 web.config 文件使您的连接字符串名称可配置。然后,您可以在调用 update-database 之前更改连接字符串。这具有与用于部署的配置转换相关的优势,因此您可以在部署到不同的服务器时更改连接字符串和/或连接字符串的名称。

在您的配置文件中:

<connectionStrings>
  <add name="DefaultConnection" connectionString="..." providerName="System.Data.SqlClient" />
  <add name="AlphaServer" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
  <add key="connStringName" value="DefaultConnection" />
</appSettings>

为此的配置转换示例:

<connectionStrings>
  <add name="DefaultConnection" xdt:Locator="Match(name)" xdt:Transform="Remove"/>
</connectionStrings>
<appSettings>
  <add key="connStringName" value="AlphaServer" xdt:Locator="Match(key)" xdt:Transform="Replace"/>
</appSettings>

在您的数据上下文构造函数中:

public DefaultDataContext()
  : base(WebConfigurationManager.AppSettings["connStringName"]) { }

在你的()电话中WebSecurity.InitializeDatabaseConnection

WebSecurity.InitializeDatabaseConnection(
  WebConfigurationManager.AppSettings["connStringName"]), ...

使用编译符号

您还可以使用编译符号(例如在构建配置中定义 ALPHA)在编译时更改连接字符串名称,但由于多种原因,它不如 web.config appSettings 条目更可取;主要是配置条目让您将所有耦合信息保存在一个地方,因此是一个更好的解决方案。

于 2013-08-25T12:31:24.580 回答