4

我正在 SQLExpress DB 上构建 MVC3 EF Code First 应用程序。对我来说非常重要的是,每当架构更改或类似情况时,数据库都会自动生成。现在我正在向我的应用程序添加身份验证,并查看了 MVC 附带的身份验证框架。但是,看起来每次生成新数据库时都需要我运行 aspnet_regsql.exe。我真的需要身份验证表与我的应用程序数据库位于同一数据库中。

我基本上想知道我的选择是什么;

  • 是否可以使用身份验证框架并以与实体框架生成我的其他数据相同的方式自动生成它?
  • 如果不是,我可以编写自己的身份验证,但是还有我可以使用的部分吗?换句话说,我是否需要编写自定义会员提供程序或类似的东西?我想继续使用属性 [authenticate] 等。

我可以在正确的方向上使用一些指针。

4

2 回答 2

3

您可以覆盖 DbMigrationsConfiguration 的种子方法或创建迁移。

然后,您应该能够执行可以从 aspnet_regsql.exe 生成的 SQL,或者在您有权限的情况下执行 aspnet_regsql.exe。

更新 1:

我最终做了如下:

Add-Migration AspNetRegSql

public partial class AspNetRegSql : DbMigration
{
    public override void Up()
    {
        Migrate(false);
    }

    public override void Down()
    {
        Migrate(true);
    }

    private static void Migrate(bool down)
    {
        var action = down ? "R" : "A";
        var connectionstring = ConfigurationManager.ConnectionStrings["DataContext"];
        var arguments = string.Format(@"-Q -C ""{0}"" -{1} mrp", connectionstring, action);

        var processStartInfo = new ProcessStartInfo
        {
            WorkingDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase).Replace(@"file:\", string.Empty),
            FileName = "aspnet_regsql.exe",
            Arguments = arguments,
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden
        };

        using (var process = Process.Start(processStartInfo))
        {
            process.WaitForExit();
        }
    }
}

然后将“aspnet_regsql.exe”添加到我的项目中,并将构建操作更改为“如果更新则复制”。

更新 2:

我不知道 NSGaga 发布的库 - 我没有看过它,但建议你也考虑一下。

更新 3:

一些有用的链接:

于 2012-04-28T10:47:35.097 回答
3

您可以从CodeFirst Membership Provider (首先基于代码的自定义提供程序)开始,并在需要时对其进行扩展(也可以通读网站上的推荐用法)。

以上是 IMO 最好的方式,因为您可以真正整合两者(例如,如果您可能需要直接访问会员表,与您自己的用户/客户表等相关联)。

但你也有其他选择......

a) 编写自己的 Db 初始化程序并为数据库播种(就像这里建议的https://stackoverflow.com/a/5462981/417747一样。注意:您可以使用不同的方法,从运行 aspnet 表 SQL 脚本到创建模型aspnet 表等)或

b) 使用“保留”数据库的 Db 初始化程序 - 并首先使用 aspnet 表准备数据库

c)(最后但并非最不重要)使用迁移(正如@Chris 正确建议的那样)。迁移非常强大。您可以运行Update-Database -Script以生成 SQL 而不是更改数据库 - 然后将其组合(与 aspnet 脚本或种子数据库)并使用它来创建或更新数据库。迁移需要一些学习,但对于任何更复杂的事情来说,再次付出努力都是值得的。

希望这可以帮助

于 2012-04-28T13:16:28.317 回答