1

我喜歡有MVC4以外的域。因此,我的migrations文件夾位於域項目中。實體框架遷移,域外mvc4,簡單會員

至於其他人,我想用種子由Web安全創建的表:由SimpleMembershipProvider創建 http://odetocode.com/Blogs/scott/archive/2012/08/31/seeding-membership-amp-roles-in-asp-net-mvc-4.aspx

表不暴露我的DbContext和播種這些表的唯一方式是通過使用代碼從鏈接。很顯然,這段代碼在我的域名項目中不起作用。

在使用遷移時,MVC4以外的域項目是否意味着我無法再使用SimpleMembershipProvider?還是有一種將這三種東西結合在一起的巧妙方式?

對不起,如果這是一個有點愚蠢的問題,因爲我剛剛轉移到MVC4。謝謝

+0

有一些技巧可以使SimpleMembership與您的域一起工作,但您可能需要分享更多信息才能獲得有用的答案。您的域名是否與用戶會員信息緊密結合,還是完全獨立?你打算使用OAth嗎?你在播種什麼,它有多重要?播種只是單元測試還是生產需要?在我看來,如果會員和角色信息需要大量的擴展和集成,您最好創建自己的自定義會員和角色提供者。 –

回答

0

我面臨同樣的問題,我想出的解決方案是在配置器中公開種子事件,並讓應用程序訂閱SimpleMembership種子。

首先,配置:

internal sealed class Configuration : DbMigrationsConfiguration<MyContext> 
    { 
     public event EventHandler<MyContext> OnSeed; 

     public Configuration() 
     { 
      AutomaticMigrationsEnabled = false; 
     } 

     protected override void Seed(MyContext context) 
     { 
      var onSeed = this.OnSeed; 
      if (onSeed != null) 
       onSeed(this, context); 

      // This method will be called after migrating to the latest version. 

      // You can use the DbSet<T>.AddOrUpdate() helper extension method 
      // to avoid creating duplicate seed data. E.g. 
      // 
      // context.People.AddOrUpdate(
      //  p => p.FullName, 
      //  new Person { FullName = "Andrew Peters" }, 
      //  new Person { FullName = "Brice Lambson" }, 
      //  new Person { FullName = "Rowan Miller" } 
      // ); 
      // 
     } 
    } 

然後,爲了能夠與Database.SetInitializer使用它,我創建了自己IDatabaseInitializer的基礎上,MigrateDatabaseToLatestVersion。這很容易做,因爲,如this post所說(你可以檢查here),它只是DbMigration的一個包裝。

public class MyDatabaseInitializer : IDatabaseInitializer<MyContext> 
{ 
    private readonly Configuration config; 

    public event EventHandler<MyContext> OnSeed 
    { 
     add { if (this.config != null) this.config.OnSeed += value; } 
     remove { if (this.config != null) this.config.OnSeed -= value; } 
    } 

    /// <summary> 
    ///  Initializes a new instance of the MigrateDatabaseToLatestVersion class. 
    /// </summary> 
    public MyDatabaseInitializer() 
    { 
     this.config = new Configuration(); 
    } 

    /// <summary> 
    ///  Initializes a new instance of the MigrateDatabaseToLatestVersion class that will 
    ///  use a specific connection string from the configuration file to connect to 
    ///  the database to perform the migration. 
    /// </summary> 
    /// <param name="connectionStringName"> The name of the connection string to use for migration. </param> 
    public MyDatabaseInitializer(string connectionStringName) 
    { 
     Contract.Requires(!string.IsNullOrWhiteSpace(connectionStringName)); 

     this.config = new Configuration 
         { 
          TargetDatabase = new DbConnectionInfo(connectionStringName) 
         }; 
    } 

    /// <inheritdoc /> 
    public void InitializeDatabase(MyContext context) 
    { 
     var migrator = new DbMigrator(config); 
     migrator.Update(); 
    } 
} 

在這個初始值設定項中,我公開地公開了OnSeed事件。在App_Start中,在MVC項目中,我訂閱它以播種SimpleMembership數據。

var initializer = new PoipDatabaseInitializer(); 
initializer.OnSeed += (s, e) => SeedSecurity(); 
Database.SetInitializer(initializer); 


private static void SeedSecurity() 
    { 
     WebSecurity.InitializeDatabaseConnection("MyDatabase", "UserProfile", "UserId", "UserName", autoCreateTables: false); 

     if (!Roles.RoleExists("SysAdmin")) 
      Roles.CreateRole("SysAdmin"); 

     if (!WebSecurity.UserExists("sysadmin")) 
      WebSecurity.CreateUserAndAccount(
       "sysadmin", 
       "password" 
      ); 

     if (!Roles.GetRolesForUser("sysadmin").Contains("SysAdmin")) 
      Roles.AddUsersToRoles(new[] { "sysadmin" }, new[] { "SysAdmin" }); 
    } 
+0

嗨,亞瑟,謝謝你看這個。我需要承認我找到了解決這個問題的辦法,但是太忙了(懶惰)去更新這個問題。我剛剛根據此鏈接重新創建了SimpleMembership Schema(請注意,正確的模式在註釋中給出)。至於你的解決方案,我還不夠好,說它沒問題。我會發布我的解決方案,在6個月後,我會用更多的讚揚來標記它,你說什麼?或者也許會有第三個?但是你的解決方案非常有趣。 –

+0

正如我所說,我正面臨着這個問題,我剛剛提出了這個解決方案。我將觀察它將如何工作,如果有任何警告,那麼該項目仍在開發中。我真的想看看你的或任何其他可用的!我還在我的模型中加入了SimpleMembership表格,但是我決定將這個表格放入我的模型中(但是我決定了這個表格)讓SimpleMembership使用正確的方法給它的數據播種,因爲我不確定它是否修改了除期望表以外的任何內容。 –