2012-04-28 184 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