我正在使用 Asp-Team 的 ASP.NET 身份示例,并且我正在尝试更改IdentityDbContext
的数据库......
我用构造函数试过了
public MyDbContext() : base("MyConnectionString") { } // base is IdentityDbContext
就像 DbContext 类一样。
在我尝试注册用户之前,这效果很好...
await IdentityStore.CreateLocalUser(user, model.Password)
返回false
...没有错误,什么都没有。
有什么想法可以解决这个问题吗?
编辑:
文件名为ModelsAppModel.cs
,有MyDbContext class
原来是
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}
我把它改成了
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
连接字符串正在工作,因为我有其他项目使用相同的字符串,并且它们运行良好。
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
下面是有关如何成功更改数据库的分步说明。首先,清理您以前可能做过的任何操作。如果有任何可能您可能无法获得所有内容,最好只是在新文件夹中开始使用一个全新的副本。
源 100% 恢复到原始状态后,请确保清理其他所有内容,包括删除"新"数据库和原始数据库 (aspnet-AspnetIdentitySample-20130627083537_2(。可以使用 SQL Server 对象资源管理器查找原始数据库。(Visual Studio 中的"视图"->"SQL Server 对象资源管理器"(
接下来,在首次运行新应用程序之前,请继续进行更改以使用所选的数据库名称。以下是步骤:
1. 在 web.config 中设置新的数据库连接
<connectionStrings>
<!-- Original Connection String -->
<!--
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)v11.0;
Initial Catalog=aspnet-AspnetIdentitySample-20130627083537_2;Integrated Security=True"
providerName="System.Data.SqlClient" />
-->
<!-- New Connection String -->
<add name="MyConnectionString" connectionString="Data Source=(LocalDb)v11.0;
Initial Catalog=MyAspnetIdentitySample_1;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
2. 修改 AppModel.cs 以使 DBContext 使用新连接:
老:
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}
新增功能:
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
3. 启用数据库迁移,创建种子数据并更新以验证
3.1-在包管理器控制台中,启用数据库迁移:
PM> enable-migrations
3.2 - 更新迁移\配置.cs以启用自动迁移和种子数据
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
protected override void Seed(AspnetIdentitySample.Models.MyDbContext context)
{
context.Users.AddOrUpdate(
p => p.UserName,
new MyUser { UserName = "John Doe" }
);
}
3.3 - 通过迁移创建数据库。在程序包管理器控制台中:
PM> update-database
3.4 - 通过使用 SQL Server 对象资源管理器并查找数据库"MyAspnetIdentitySample_1",验证是否已创建新数据库(并且最初提供的数据库名称不存在(。
4. 运行应用并创建新的登录名以进行验证
这就是您从头开始成功完成的方法 - 如果您不提供更多详细信息,我无法与您一起/为您进行故障排除。您应该能够确定您出错的地方。
对于新的 mvc5 应用程序上 VS2013 附带的 1.0 版本,答案不再有效。要立即执行此操作:
声明一个类,如下所示:
public class AppUserStore : UserStore<IdentityUser>
{
public AppUserStore():base(new MY_IDENTITYDBCONTEXT())
{
}
}
在 Startup.Auth 上.cs更改
UserManagerFactory = () => new UserManager<IdentityUser>(new UserStore<IdentityUser>());
自
UserManagerFactory = () => new UserManager<IdentityUser>(new AppUserStore());
如果没有这个,您的 IdentityDbContext 构造函数(例如OnModelCreating
(将不会在创建具有 asp.net 身份的用户时运行。
我遇到了同样的问题,并且有点挣扎,因为网上还没有太多关于 ASP.NET 身份的材料。在对程序集进行检查后,我发现它实际上很简单。
只需找到初始化 AuthenticationIdentityManager 的位置,并使用 IdentityStore 重载来指定数据库上下文,如下所示:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore(new Model()));
我的模型类继承了 DbContext。希望这有帮助。
RobM 有全面的答案,Rob B 有简单的答案。
在您的方案中,您将基设置为"MyConnectionString",该基在配置文件中不存在。
<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MyConnectionString") { }
}
无论你给连接字符串起什么名字,都必须与 DbContext 中的任何名称相匹配:
base<connectionStrings>
<add name="MySailorContext" connectionString="Data Source=THOMAS-LAPTOP;Initial Catalog=MySailor;Integrated Security=True;Pooling=False;MultipleActiveResultSets=true" providerName="System.Data.SqlClient"/>
</connectionStrings>
public class MyDbContext : IdentityDbContext<MyUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
public MyDbContext() : base("MySailorContext") { }
}
如果您只需要更改标识提供者使用的连接字符串,则以下内容不是很优雅,但似乎有效。搜索实例化 IdentityManager 类的位置,并添加以下内容:
//Leave this untouched:
IdentityManager = new AuthenticationIdentityManager(new IdentityStore());
//...and add this:
((IdentityStore)identityManager.Store).DbContext.Configuration
.Database.Connection.ConnectionString = "your connection string here";
由于在转到 RTM 时对此有很多更改,因此我更新了使用 WebApi 控制器进行所有标识登录等的 SPA 模板。这是一个非常酷的模板,如果你还没有看过它。
我把我所有的代码都放在这里:https://github.com/s093294/aspnet-identity-rtm/tree/master
(请注意,它只是为了灵感。我只是让它工作,仅此而已。适当地也有一两个错误(。
查找继承自 IdentityDbConect 的类,例如:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
然后将"DefaultConnection"更改为 web.config 中标识的连接字符串的名称。