我正在尝试将用户和角色植入我的数据库。 目前在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项目中。不确定这是否与它有关。
答案 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。 错误将停止。