ASP.NET身份与EF数据库第一个MVC5
是否可以将新的Asp.net标识与Database First和EDMX一起使用?还是只使用代码优先 以下是我所做的: 1) 我创建了一个新的MVC5项目,并让新标识在我的数据库中创建新的用户和角色表 2) 然后,我打开了数据库中的第一个EDMX文件,并拖入了新的Identity Users表,因为我还有其他与之相关的表 3) 保存EDMX后,数据库第一个POCO生成器将自动创建一个用户类。但是,UserManager和RoleManager需要一个从新的标识命名空间(Microsoft.AspNet.Identity.IUser)继承的用户类,因此使用POCO用户类将不起作用 我想一个可能的解决方案是编辑我的POCO生成类,让我的用户类从IUser继承 还是ASP.NET标识仅与代码优先设计兼容 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 更新:以下是安德斯·阿贝尔的建议,我就是这么做的。它的工作,但我想知道是否有一个更优雅的解决方案 1) 我通过在与自动生成的实体相同的命名空间内创建分部类来扩展实体用户类ASP.NET身份与EF数据库第一个MVC5,asp.net,asp.net-mvc,asp.net-mvc-5,ef-database-first,asp.net-identity,Asp.net,Asp.net Mvc,Asp.net Mvc 5,Ef Database First,Asp.net Identity,是否可以将新的Asp.net标识与Database First和EDMX一起使用?还是只使用代码优先 以下是我所做的: 1) 我创建了一个新的MVC5项目,并让新标识在我的数据库中创建新的用户和角色表 2) 然后,我打开了数据库中的第一个EDMX文件,并拖入了新的Identity Users表,因为我还有其他与之相关的表 3) 保存EDMX后,数据库第一个POCO生成器将自动创建一个用户类。但是,UserManager和RoleManager需要一个从新的标识命名空间(Microsoft.Asp
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
2) 我将DataContext更改为从IdentityDBContext而不是DBContext继承。请注意,每次更新EDMX并重新生成DBContext和Entity类时,都必须将其设置回此值
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }
应该可以先将标识系统与POCO和数据库一起使用,但您必须做一些调整:
部分。这将使您能够在单独的文件中提供额外的实现
User
类用户
类实现正确的界面,而不涉及实际生成的文件(编辑生成的文件总是一个坏主意)。编辑:
我想使用现有数据库并与ApplicationUser建立关系。这就是我使用SQL Server的方式,但同样的想法可能适用于任何数据库
:base(“DefaltConnection”)
以使用项目的DbContext李>
编辑:Asp.Net标识类图
IdentityUser
在这里毫无价值,因为它是UserStore
用于身份验证的代码优先对象。在定义了自己的User
对象之后,我实现了一个部分类,该类实现了IUser
,由UserManager
类使用。我希望我的Id
s是int
而不是string,所以我只返回用户Id的toString()。类似地,我希望n
中的Username
被取消资本化
public partial class User : IUser
{
public string Id
{
get { return this.UserID.ToString(); }
}
public string UserName
{
get
{
return this.Username;
}
set
{
this.Username = value;
}
}
}
您根本不需要IUser
。它只是UserManager
使用的一个接口。因此,如果您想定义一个不同的“IUser”,您必须重写这个类以使用您自己的实现
public class UserManager<TUser> : IDisposable where TUser: IUser
下面是一些接口实现的示例
async Task IUserStore<TUser>.CreateAsync(TUser user)
{
user.CreatedDate = DateTime.Now;
_context.Users.Add(user);
await _context.SaveChangesAsync();
}
async Task IUserStore<TUser>.DeleteAsync(TUser user)
{
_context.Users.Remove(user);
await _context.SaveChangesAsync();
}
现在,登录应该可以处理您自己的表。我们有一个实体模型DLL项目,我们在其中保存模型类。我们还保留一个包含所有数据库脚本的数据库项目。我的做法如下 1) 首先使用数据库创建具有EDMX的您自己的项目 2) 为数据库中的表编写脚本,我使用VS2013连接到localDB(数据连接),并将脚本复制到数据库项目中,添加任何自定义列,例如BirthDate[DATE]not null 3) 部署数据库 4) 更新模型(EDMX)项目并将其添加到模型项目中 5) 向应用程序类添加任何自定义列
public class ApplicationUser : IdentityUser
{
public DateTime BirthDate { get; set; }
}
在MVC项目AccountController中添加了以下内容:
标识提供程序需要SQL连接字符串才能工作,若要为数据库保留1个连接字符串,请从EF连接字符串中提取提供程序字符串
public AccountController()
{
var connection = ConfigurationManager.ConnectionStrings["Entities"];
var entityConnectionString = new EntityConnectionStringBuilder(connection.ConnectionString);
UserManager =
new UserManager<ApplicationUser>(
new UserStore<ApplicationUser>(
new ApplicationDbContext(entityConnectionString.ProviderConnectionString)));
}
publiccountcontroller()
{
var connection=ConfigurationManager.connectionString[“实体”];
var entityConnectionString=新的EntityConnectionStringBuilder(connection.ConnectionString);
用户管理器=
新用户管理器(
新用户商店(
新的ApplicationDbContext(entityConnectionString.ProviderConnectionString));
}
在GitHub上查看此项目:
其中包括:
- ASP.NET Identity 2.0的SQL数据库项目模板
- 实体框架数据库第一个提供程序
- 源代码和示例
另请参见:我花了几个小时研究这个问题,最终找到了一个解决方案,并在我的博客上分享了这个解决方案。基本上,您需要完成在的回答中所说的一切,但还有一件事:确保Identity Framework在用于应用程序实体的实体框架连接字符串之上有一个特定的SQL客户端连接字符串
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
总之,应用程序将为Identity Framework使用一个连接字符串,为应用程序实体使用另一个连接字符串。每个连接字符串的类型不同。阅读我的博客文章获取完整教程。我的步骤非常相似,但我想与大家分享 1) 创建一个新的
public class ApplicationUser : IdentityUser
{
public DateTime BirthDate { get; set; }
}
public AccountController()
{
var connection = ConfigurationManager.ConnectionStrings["Entities"];
var entityConnectionString = new EntityConnectionStringBuilder(connection.ConnectionString);
UserManager =
new UserManager<ApplicationUser>(
new UserStore<ApplicationUser>(
new ApplicationDbContext(entityConnectionString.ProviderConnectionString)));
}
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-SSFInventory-20140521115734.mdf;Initial Catalog=aspnet-SSFInventory-20140521115734;Integrated Security=True" providerName="System.Data.SqlClient" />
<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;database=SSFInventory;integrated security=true;" providerName="System.Data.SqlClient" />
void IDatabaseInitializer<ApplicationDbContext>.InitializeDatabase(ApplicationDbContext context)
{
using (var ms = new MemoryStream(Resources.Binaries.MainSchema))
{
using (var package = DacPackage.Load(ms, DacSchemaModelStorageType.Memory))
{
DacServices services = new DacServices(Database.Connection.ConnectionString);
var options = new DacDeployOptions
{
VerifyDeployment = true,
BackupDatabaseBeforeChanges = true,
BlockOnPossibleDataLoss = false,
CreateNewDatabase = false,
DropIndexesNotInSource = true,
IgnoreComments = true,
};
services.Deploy(package, Database.Connection.Database, true, options);
}
}
}