see*_*per 9 c# entity-framework asp.net-identity-2
我想更改ASP.NET Identity 2.0使用的表的名称.我见过各种类似的问题,但没有解决我的问题.例如,这种类型的解决方案:http: //www.goatly.net/customizing-table-names-for-identitydbcontextwithcustomuser-data-contexts 似乎依赖于Code First(?).无论如何,实现OnModelCreating对我没有任何帮助.我基本上将AspNetUsers和类似的表重命名为我自己的名字,并希望能够使用它们.我有一个我想要使用的现有EF上下文(MyContext),所以我将其修改为从IdentityDbContext派生(编辑t4模板),然后在Startup.Auth中我有:
UserManagerFactory = () =>
{
var context = new MyContext();
Database.SetInitializer<MyContext>(new IdentityDbInitializer());
var userStore = new UserStore<IdentityUser>(context){
DisposeContext = true
};
return new UserManager<IdentityUser>(userStore);
};
Run Code Online (Sandbox Code Playgroud)
但是当我尝试登录时出现问题,我得到"无法联系服务器".我想这是因为我的UserStore无法知道我的上下文中的User表.我希望这是OnModelCreating代码可以做的,但我对此很朦胧.我想UserStore仍然在寻找一个"AspNetUsers"表,虽然我不知道这些名字的来源.我也很难为我的上下文修改t4模板 - 这是我应该从IdentityDbContext派生的方式吗?
任何帮助非常感谢.
Lef*_*tyX 20
几个步骤:
Microsoft.AspNet.Identity.EntityFrameworkconnection string到web.config/app.config现在您必须定义自定义Database Context:
public class MyContext : IdentityDbContext
{
public MyContext()
: base(<connection string name>)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<IdentityUser>()
.ToTable("Users");
modelBuilder.Entity<IdentityRole>()
.ToTable("Roles");
modelBuilder.Entity<IdentityUserRole>()
.ToTable("UserRoles");
modelBuilder.Entity<IdentityUserClaim>()
.ToTable("UserClaims");
modelBuilder.Entity<IdentityUserLogin>()
.ToTable("UserLogins");
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我曾经DbModelBuilder将所有实体映射到新表.
Enable-Migrations它将Migrations使用配置文件创建一个文件夹Configuration.cs.
它应该看起来像这样:
internal sealed class Configuration : DbMigrationsConfiguration<ConsoleApplication1.Models.MyContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(ConsoleApplication1.Models.MyContext context)
{
}
}
Run Code Online (Sandbox Code Playgroud)
在构造函数中将属性更改AutomaticMigrationsEnabled为true.
Update-Database它应该运行脚本来创建新表.
您可以自定义实体(和ID),为定义的每个接口创建自定义类.
public class MyUser : IdentityUser<string, MyUserLogin, MyUserRole, MyUserClaim>
{
}
Run Code Online (Sandbox Code Playgroud)
由于您使用Owin,您可以定义您的UserStore:
public class MyUserStore: UserStore<MyUser, MyRole, string, MyUserLogin, MyUserRole, MyUserClaim>
{
public MyUserStore(MyContext context)
: base(context)
{
}
}
Run Code Online (Sandbox Code Playgroud)
和你的UserManager实现:
public class ApplicationUserManager : UserManager<ASPNETIdentity2.Models.MyUser, string>
{
public ApplicationUserManager(IUserStore<ASPNETIdentity2.Models.MyUser, string> store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new MyUserStore(context.Get<MyContext>()));
manager.UserValidator = new UserValidator<MyUser, string>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
manager.PasswordValidator = new PasswordValidator()
{
RequiredLength = 5,
RequireNonLetterOrDigit = false, // true
// RequireDigit = true,
RequireLowercase = false,
RequireUppercase = false,
};
return (manager);
}
}
Run Code Online (Sandbox Code Playgroud)
你Owin.Startup应该看起来像这样:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.CreatePerOwinContext(MyContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想查看自定义实现,可以使用ASP.NET MVC上的简单工作解决方案检查我的GitHub存储库.
更新:
该解决方案中还有另一个项目,设置最少; 基本上你只需要定义你的上下文(IdentityDbContext),如果你只想重命名你的表.
该项目可以在这里找到.
| 归档时间: |
|
| 查看次数: |
14070 次 |
| 最近记录: |