无法播种用户和播放器角色

时间:2012-11-26 12:59:08

标签: asp.net-mvc entity-framework c#-4.0 seed simplemembership

我正在尝试将用户和角色植入我的数据库。 目前在C#MVC4中使用Code First Entity Framework和Automatic Migrations。 每当我打电话

  

更新 - 数据库 - 强制

我收到以下错误:

  

运行种子方法。   System.InvalidOperationException:您必须调用   在调用any之前的“WebSecurity.InitializeDatabaseConnection”方法   “WebSecurity”类的其他方法。这个电话应放在   站点根目录中的_AppStart.cshtml文件。          在WebMatrix.WebData.SimpleRoleProvider.get_PreviousProvider()          at WebMatrix.WebData.SimpleRoleProvider.RoleExists(String roleName)          在System.Web.Security.Roles.RoleExists(String roleName)          在GratifyGaming.Domain.Migrations.Configuration.Seed(GratifyGamingContext   C:\ Users \ Unreal \ Documents \ Visual Studio中的上下文)   2010 \项目\ GratifyGaming \ GratifyGaming.Domain \迁移\ Configuration.cs:行   36          在System.Data.Entity.Migrations.DbMigrationsConfiguration 1.OnSeed(DbContext context) at System.Data.Entity.Migrations.DbMigrator.SeedDatabase() at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.SeedDatabase() at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1   pendingMigrations,String targetMigrationId,String lastMigrationId)          在System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1   pendingMigrations,String targetMigrationId,String lastMigrationId)          在System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)          在System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String   targetMigration)          在System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()          在System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()       在调用“WebSecurity”类的任何其他方法之前,必须调用“WebSecurity.InitializeDatabaseConnection”方法。   此调用应放在根目录中的_AppStart.cshtml文件中   你的网站。

令人讨厌的代码行是Role.Exists

我尝试将WebSecurity.InitializeDatabaseConnection放在Global.asax,Seed()中,并创建了_AppStart.cshtml但没有成功。我已经在互联网上寻找可能的解决方案,但没有一个能够工作(包括其他堆栈溢出文章)。一些值得注意的博客文章如下。

见下面的代码。

[Configuration.cs]

 protected override void Seed(GratifyGaming.Domain.Models.DAL.GratifyGamingContext context)
    {
        var criteria = new List<Criterion>
        {
            new Criterion { ID = 1, IsMandatory=true, Name = "Gameplay", Description="The playability of the games core mechanics" },
            new Criterion { ID = 2, IsMandatory=true, Name = "Art Style", Description="The artistic feel of the game as a whole. Elements such as story, style and originality come into play." },
            new Criterion { ID = 3, IsMandatory=true, Name = "Longevity", Description="How long did this game keep you entertained?" },
            new Criterion { ID = 4, IsMandatory=true, Name = "Graphics", Description="How good does the game look?" }
        };

        criteria.ForEach(s => context.Criterion.AddOrUpdate(s));
        context.SaveChanges();


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

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

        if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
            Roles.AddUsersToRoles(new[] { "user" }, new[] { "Administrator" });
    }

Criterion种子代码可以正常运行。

[_ AppStart.cshtml]

@{
 if (!WebSecurity.Initialized)
{
    WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId",
                                             "UserName", autoCreateTables: true);
}
}

正常登录我的网站与此处的网站完美配合。

[web.config中]

 <roleManager enabled="true" defaultProvider="SimpleRoleProvider">
  <providers>
    <clear/>
    <add name="SimpleRoleProvider" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
  </providers>
</roleManager>
<membership defaultProvider="SimpleMembershipProvider">
  <providers>
    <clear/>
    <add name="SimpleMembershipProvider" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData" />
  </providers>
</membership>

[AccountModel.cs]

    [Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public virtual ICollection<Game> AttachedGames { get; set; }

    public virtual ICollection<UserGratificationRecord> GratificationHistory { get; set; }

    [ForeignKey("UserLevel")]
    public int? AcheivementID { get; set; }
    public virtual Acheivement UserLevel { get; set; }

    public int? NumOfGratifictions { get; set; }

}

更新

我认为WebSecurity.InitializeDatabaseConnection甚至没有运行 - 我可以在我的Seed方法中放置多个,而不是通常会得到'只能被调用一次'错误。

我的种子方法在我的域项目中与所有模型一起,而其他所有内容都在WebUI项目中。不确定这是否与它有关。

3 个答案:

答案 0 :(得分:4)

只需将lazy init放入Seed方法的顶部

即可
protected override void Seed(GratifyGaming.Domain.Models.DAL.GratifyGamingContext context)
{
    if (!WebSecurity.Initialized)
    {
        WebSecurity.InitializeDatabaseConnection("DefaultConnection",
                                                 "UserProfile",
                                                 "UserId",
                                                 "UserName",
                                                 autoCreateTables: true);
    }

答案 1 :(得分:1)

在App_Start中,尝试添加:

        var configuration = new Data.Migrations.Configuration();
        var migrator = new DbMigrator(configuration);
        migrator.Update();

您必须公开您的configuration.cs文件

  public class Configuration : DbMigrationsConfigurati

这应该会在运行程序时调用种子方法

答案 2 :(得分:0)

删除您对WebMatrix.WebData的现有引用 添加参考WebMatrix.WebData版本2。 错误将停止。