2012-04-28 185 views
4

我正在SQLExpress DB上构建MVC3 EF代码优先应用程序。对于我来说非常重要的是,只要架构发生变化或类似情况,数据库就会自动生成。现在我将身份验证添加到我的应用程序中,并且查看了MVC附带的身份验证框架。但是,它看起来每次生成新数据库时都需要运行aspnet_regsql.exe。我真的需要身份验证表与我的应用程序数据库位于同一个数据库中。MVC3:EF代码优先和认证

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

  • 是否有可能使用的验证框架,并把它自动在作为实体框架生成我的其他数据以同样的方式产生的?
  • 如果不是,我可以编写自己的认证,但是还有哪些部分可以使用?换句话说,我是否需要写一个自定义会员供应商或类似的东西?我想继续使用属性[认证]等

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

回答

3

您可以用CodeFirst Membership Provider 启动首先 - 并扩大如果需要(也请阅读网站上推荐的使用方法)。

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

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

一)写一个自己的数据库初始化和种子荷兰国际集团数据库(像什么这里https://stackoverflow.com/a/5462981/417747建议真实。注意:您可以利用不同的方法,从运行ASPNET表的SQL脚本来创建ASPNET表等)或

二)模型中使用Db的初始化其“蜜饯”的数据库 - 使用ASPNET表准备数据库第一

C)(最后但并非最不重要)使用迁移(由@克里斯为正确的建议)。迁移非常强大。您可以运行Update-Database -Script来生成SQL,而不是更改Db - 然后结合(使用aspnet脚本或seed-ed db)并将其用于创建或更新数据库。迁移需要一些学习,但对于任何更复杂的事情来说,再次值得付出努力。

希望这有助于

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:

一些有用的链接: - 这是一个基于代码的自定义提供商

+0

看起来一样好 - 也许这就是最好创建数据库第一次当放置在“种子”,即(或迁移必须是一个初始) - 并因可能的权限问题(我没有尝试过,但似乎是运行自定义批处理文件的一个非常好的场景,而且更通用) - 也就是说它更容易控制它形成种子 - 比起例如PM控制台通常是从PM开始的(坦率地说,我不知道在某些情况下可能会如何泛滥 - 尽管可能应该起作用 - 我通常以管理员身份运行VS,所以很可能不会看到任何问题)。 – NSGaga 2012-04-28 17:35:46