C# 在ASP.NET MVC应用程序中使用UserManager的种子方法期间未创建任何用户
当C# 在ASP.NET MVC应用程序中使用UserManager的种子方法期间未创建任何用户,c#,.net,entity-framework,asp.net-mvc-5.1,C#,.net,Entity Framework,Asp.net Mvc 5.1,当Seed方法运行时,记录/对象被添加到我的数据库中 在我尝试将用户添加到我的应用程序之前(在Seedmethod的底部),每个对象都会按其应该的方式添加。没有人被添加。此外,在底部还有大量抛出的SQL异常。即使Seed方法为空,也会抛出它们 如何将用户添加到实体框架管理的数据库?我根据Scott Allen的教程创建了代码 protected override void Seed(WebApplication2.Models.ApplicationDbContext context) {
Seed
方法运行时,记录/对象被添加到我的数据库中
在我尝试将用户添加到我的应用程序之前(在Seed
method的底部),每个对象都会按其应该的方式添加。没有人被添加。此外,在底部还有大量抛出的SQL
异常。即使Seed
方法为空,也会抛出它们
如何将用户添加到实体框架管理的数据库?我根据Scott Allen的教程创建了代码
protected override void Seed(WebApplication2.Models.ApplicationDbContext context) {
System.Diagnostics.Debug.WriteLine("Seed started");//IT WORKS
if (!context.Persons.Any()) {
var persons = new List<Person> {
new Person{FirstName = "John", LastName = "Doe", CellNumber = "123-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "312312312", Notes = "Annoying"},
new Person{FirstName = "Anna", LastName = "Doe", CellNumber = "113-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "548555672", Notes = "Less Annoying"}
};
persons.ForEach(person => context.Persons.AddOrUpdate(person));
context.SaveChanges();
}
if (!context.Meetings.Any()) {
var meetings = new List<Meeting>{
new Meeting{PersonId = 1, Body = "Body of meeting", Date = DateTime.Now}
};
meetings.ForEach(meeting => context.Meetings.AddOrUpdate(meeting));
context.SaveChanges();
}
if (!context.Statuses.Any()) {
var statuses = new List<Status> {
new Status{Name = "OK"},
new Status {Name = "NOT_OK"}
};
statuses.ForEach(status => context.Statuses.AddOrUpdate(status));
context.SaveChanges();
}
//EVERYTHING TILL NOW WORKS
//Users Seeding
if (!context.Users.Any()) {
System.Diagnostics.Debug.WriteLine("USER SEED");
try {
var store = new UserStore<ApplicationUser>(context);
var manager = new UserManager<ApplicationUser>(store);
//why user is not created
var user1 = new ApplicationUser { UserName = "admin", Email = "informatyka4444@wp.pl" };
var user2 = new ApplicationUser { UserName = "emp", Email = "informatyka4444@wp.pl" };
manager.Create(user1, "admin");
manager.Create(user2, "emp");
context.SaveChanges();
} catch (Exception e) { System.Diagnostics.Debug.WriteLine("THERE WAS AN EXCEPTION"); }
}
}
编辑2 下面是构造函数: Models.IdentityModels.cs
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System.Data.Entity;
using System.Data.Entity.ModelConfiguration.Conventions;
namespace WebApplication2.Models {
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser {
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) {
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser> {
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false) {
System.Diagnostics.Debug.WriteLine("CONSTRCTOR");
}
public DbSet<Person> Persons { get; set; }
public DbSet<Meeting> Meetings { get; set; }
public DbSet<Status> Statuses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
public static ApplicationDbContext Create() {
return new ApplicationDbContext();
}
}
}
namespace WebApplication2.Migrations {
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using WebApplication2.Models;
internal sealed class Configuration : DbMigrationsConfiguration<WebApplication2.Models.ApplicationDbContext> {
public Configuration() {
AutomaticMigrationsEnabled = true;
ContextKey = "WebApplication2.Models.ApplicationDbContext";
}
protected override void Seed(WebApplication2.Models.ApplicationDbContext context) {
/*
System.Diagnostics.Debug.WriteLine("Seed started");
if (!context.Persons.Any()) {
var persons = new List<Person> {
new Person{FirstName = "John", LastName = "Doe", CellNumber = "123-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "312312312", Notes = "Annoying"},
new Person{FirstName = "Anna", LastName = "Doe", CellNumber = "113-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "548555672", Notes = "Less Annoying"}
};
persons.ForEach(person => context.Persons.AddOrUpdate(person));
context.SaveChanges();
}
if (!context.Meetings.Any()) {
var meetings = new List<Meeting>{
new Meeting{PersonId = 1, Body = "Body of meeting", Date = DateTime.Now}
};
meetings.ForEach(meeting => context.Meetings.AddOrUpdate(meeting));
context.SaveChanges();
}
if (!context.Statuses.Any()) {
var statuses = new List<Status> {
new Status{Name = "OK"},
new Status {Name = "NOT_OK"}
};
statuses.ForEach(status => context.Statuses.AddOrUpdate(status));
context.SaveChanges();
}*/
//Users Seeding
if (!context.Users.Any()) {
System.Diagnostics.Debug.WriteLine("USER SEED");
try {
System.Diagnostics.Debug.WriteLine("1");
var store = new UserStore<ApplicationUser>(context);
var manager = new UserManager<ApplicationUser>(store);
//why user is not created
System.Diagnostics.Debug.WriteLine("2");
var user1 = new ApplicationUser { UserName = "admin", Email = "informatyka4444@wp.pl" };
var user2 = new ApplicationUser { UserName = "emp", Email = "informatyka4444@wp.pl" };
System.Diagnostics.Debug.WriteLine("3");
manager.Create(user1, "admin");
manager.Create(user2, "emp");
System.Diagnostics.Debug.WriteLine("4");
context.SaveChanges();
System.Diagnostics.Debug.WriteLine("5");
} catch (Exception e) { System.Diagnostics.Debug.WriteLine("THERE WAS AN EXCEPTION"); }
System.Diagnostics.Debug.WriteLine("6");
}
}
}
}
您必须从上下文中获取当前管理器:
var manager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
使用此管理器实例,您应该能够正确创建用户。是否在调试中运行?用户的状态是什么。有吗?除非显式调用数据库初始化,否则种子方法不会在运行时运行。(或者,在设计时,您可以在nuget命令行中使用db migrations来对要执行的seed方法进行case处理)。如果您担心异常,您应该在
CONSTRCTOR
调试语句所在的位置发布。@Yoda问了一个有点傻的问题,但您在看什么数据库?只是为了验证?@Yoda我同样感到困惑。您是否通过PM控制台启用了迁移。您是否可以尝试通过PM控制台进行更新,看看有什么不同?
namespace WebApplication2.Migrations {
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Migrations;
using System.Linq;
using WebApplication2.Models;
internal sealed class Configuration : DbMigrationsConfiguration<WebApplication2.Models.ApplicationDbContext> {
public Configuration() {
AutomaticMigrationsEnabled = true;
ContextKey = "WebApplication2.Models.ApplicationDbContext";
}
protected override void Seed(WebApplication2.Models.ApplicationDbContext context) {
/*
System.Diagnostics.Debug.WriteLine("Seed started");
if (!context.Persons.Any()) {
var persons = new List<Person> {
new Person{FirstName = "John", LastName = "Doe", CellNumber = "123-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "312312312", Notes = "Annoying"},
new Person{FirstName = "Anna", LastName = "Doe", CellNumber = "113-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "548555672", Notes = "Less Annoying"}
};
persons.ForEach(person => context.Persons.AddOrUpdate(person));
context.SaveChanges();
}
if (!context.Meetings.Any()) {
var meetings = new List<Meeting>{
new Meeting{PersonId = 1, Body = "Body of meeting", Date = DateTime.Now}
};
meetings.ForEach(meeting => context.Meetings.AddOrUpdate(meeting));
context.SaveChanges();
}
if (!context.Statuses.Any()) {
var statuses = new List<Status> {
new Status{Name = "OK"},
new Status {Name = "NOT_OK"}
};
statuses.ForEach(status => context.Statuses.AddOrUpdate(status));
context.SaveChanges();
}*/
//Users Seeding
if (!context.Users.Any()) {
System.Diagnostics.Debug.WriteLine("USER SEED");
try {
System.Diagnostics.Debug.WriteLine("1");
var store = new UserStore<ApplicationUser>(context);
var manager = new UserManager<ApplicationUser>(store);
//why user is not created
System.Diagnostics.Debug.WriteLine("2");
var user1 = new ApplicationUser { UserName = "admin", Email = "informatyka4444@wp.pl" };
var user2 = new ApplicationUser { UserName = "emp", Email = "informatyka4444@wp.pl" };
System.Diagnostics.Debug.WriteLine("3");
manager.Create(user1, "admin");
manager.Create(user2, "emp");
System.Diagnostics.Debug.WriteLine("4");
context.SaveChanges();
System.Diagnostics.Debug.WriteLine("5");
} catch (Exception e) { System.Diagnostics.Debug.WriteLine("THERE WAS AN EXCEPTION"); }
System.Diagnostics.Debug.WriteLine("6");
}
}
}
}
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using WebApplication2.Migrations;
using WebApplication2.Models;
namespace WebApplication2 {
public class MvcApplication : System.Web.HttpApplication {
protected void Application_Start() {
System.Diagnostics.Debug.WriteLine("Application_Start");
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationDbContext, Configuration>());
new ApplicationDbContext().Database.Initialize(true);
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=301880
-->
<configuration>
<configSections>
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --></configSections>
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-WebApplication2-20140711041006.mdf;Initial Catalog=aspnet-WebApplication2-20140711041006;Integrated Security=True" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
</system.web>
<system.webServer>
<modules>
<remove name="FormsAuthenticationModule" />
</modules>
</system.webServer>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Optimization" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="1.1.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-1.5.2.14234" newVersion="1.5.2.14234" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<entityFramework>
<!-- <contexts>
<context type="WebApplication2.Models.ApplicationDbContext, WebApplication2">
<databaseInitializer type="WebApplication2.Migrations.Configuration, WebApplication2" />
</context>
</contexts>-->
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
</configuration>
System.Diagnostics.Debug.WriteLine("BEFORE " + !context.Users.Any());
if (!context.Users.Any()) {
System.Diagnostics.Debug.WriteLine("INSIDE");
var hasher = new PasswordHasher();
var users = new List<ApplicationUser> {
new ApplicationUser{UserName = "admin", PasswordHash = hasher.HashPassword("admin")}
};
users.ForEach(user => context.Users.AddOrUpdate(user));
context.SaveChanges();
}
namespace WebApplication2.Migrations {
using Microsoft.AspNet.Identity;
using System;
using System.Collections.Generic;
using System.Data.Entity.Migrations;
using System.Data.Entity.Validation;
using System.Linq;
using WebApplication2.Models;
internal sealed class Configuration : DbMigrationsConfiguration<WebApplication2.Models.ApplicationDbContext> {
public Configuration() {
AutomaticMigrationsEnabled = true;
ContextKey = "WebApplication2.Models.ApplicationDbContext";
}
protected override void Seed(WebApplication2.Models.ApplicationDbContext context) {
System.Diagnostics.Debug.WriteLine("Seed started");
if (!context.Persons.Any()) {
var persons = new List<Person> {
new Person{FirstName = "John", LastName = "Doe", CellNumber = "123-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "312312312", Notes = "Annoying"},
new Person{FirstName = "Anna", LastName = "Doe", CellNumber = "113-456-789", SecondaryPhoneNumber = "98873213", Address = "1street 2",BirthDate = DateTime.Now.Date, Pesel = "548555672", Notes = "Less Annoying"}
};
persons.ForEach(person => context.Persons.AddOrUpdate(person));
context.SaveChanges();
}
if (!context.Meetings.Any()) {
var meetings = new List<Meeting>{
new Meeting{PersonId = 1, Body = "Body of meeting", Date = DateTime.Now}
};
meetings.ForEach(meeting => context.Meetings.AddOrUpdate(meeting));
context.SaveChanges();
}
if (!context.Statuses.Any()) {
var statuses = new List<Status> {
new Status{Name = "OK"},
new Status {Name = "NOT_OK"}
};
statuses.ForEach(status => context.Statuses.AddOrUpdate(status));
context.SaveChanges();
}
//Users Seeding
System.Diagnostics.Debug.WriteLine("BEFORE " + !context.Users.Any());
if (!context.Users.Any()) {
System.Diagnostics.Debug.WriteLine("INSIDE");
var hasher = new PasswordHasher();
try {
var users = new List<ApplicationUser> {
new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "informatyka4444@wp.pl", UserName = "informatyka4444@wp.pl"},
new ApplicationUser{PasswordHash = hasher.HashPassword("TestPass44!"), Email = "informatyka4445@wp.pl", UserName = "informatyka4445@wp.pl"}
};
users.ForEach(user => context.Users.AddOrUpdate(user));
context.SaveChanges();
} catch (DbEntityValidationException e) {
System.Diagnostics.Debug.WriteLine("EXC: ");
foreach (DbEntityValidationResult result in e.EntityValidationErrors) {
foreach (DbValidationError error in result.ValidationErrors) {
System.Diagnostics.Debug.WriteLine(error.ErrorMessage);
}
}
}
}
}
}
}
var manager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
using Microsoft.AspNet.Identity.Owin;