使用EF数据库的ASP.NET身份第一MVC5
是否有可能使用数据库优先和EDMX新的Asp.net身份? 或者只与代码第一?
以下是我所做的:
1)我做了一个新的MVC5项目,并有新的身份在我的数据库中创build新的用户和angular色表。
2)然后我打开我的数据库第一个EDMX文件,并拖入新的身份用户表,因为我有其他表与它有关。
3)保存EDMX后,Database First POCO生成器将自动创build一个User类。 但是,UserManager和RoleManager需要从新的Identity名称空间(Microsoft.AspNet.Identity.IUser)inheritance的User类,因此使用POCO User类将不起作用。
我想一个可能的解决scheme是编辑我的POCO代类让我的用户类从IUserinheritance?
或者,ASP.NET身份只与Code First Design兼容?
++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
更新:下面的安德斯亚伯的build议,这是我所做的。 它的工作,但我想知道是否有一个更优雅的解决scheme。
1)通过在与我的自动生成的实体相同的命名空间内创build一个部分类来扩展我的实体用户类。
namespace MVC5.DBFirst.Entity { public partial class AspNetUser : IdentityUser { } }
2)我改变了我的DataContext从IdentityDBContext而不是DBContextinheritance。 请注意,每次更新EDMX并重新生成DBContext和Entity类时,都必须将其重新设置为此。
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
3)在自动生成的用户实体类中,必须将override关键字添加到以下4个字段,或者将这些字段注释掉,因为它们是从IdentityUserinheritance的(步骤1)。 请注意,每次更新EDMX并重新生成DBContext和Entity类时,都必须将其重新设置为此。
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和Database First中使用身份系统,但是你需要做一些调整:
- 更新POCO生成的.tt文件以使实体类成为
partial
。 这将使您可以在另外的文件中提供额外的实施。 - 在另一个文件中部分实现
User
类
partial User : IUser { }
这将使User
类实现正确的接口,而不触及实际生成的文件(编辑生成的文件总是一个坏主意)。
我的步骤非常相似,但我想分享。
1)创build一个新的MVC5项目
2)创build一个新的Model.edmx。 即使它是一个新的数据库,并没有表格。
3)编辑web.config并replace这个生成的连接string:
<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" />
用这个连接string:
<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;database=SSFInventory;integrated security=true;" providerName="System.Data.SqlClient" />
之后,构build并运行应用程序。 注册一个用户,然后创build表格。
编辑: 与EF数据库第一MVC5 CodePlex项目模板的ASP.NET身份。
我想使用现有的数据库并与ApplicationUser创build关系。 这是我如何使用SQL Server做的,但同样的想法可能适用于任何数据库。
- 创build一个MVC项目
- 打开Web.config中的DefaultConnection下列出的数据库。 它会被称为(aspnet- [时间戳]或类似的东西。)
- 脚本数据库表。
- 将脚本表插入到SQL Server Management Studio中的现有数据库中。
- 自定义和添加关系到ApplicationUser (如有必要)。
- 创build新的Web项目> MVC>数据库第一个项目>使用EF导入数据库…排除您插入的标识类。
- 在IdentityModels.cs中,更改ApplicationDbContext
:base("DefaltConnection")
以使用项目的DbContext。
编辑: Asp.Net身份类图
IdentityUser
在这里没有价值,因为它是UserStore
用于validation的代码优先对象。 在定义我自己的User
对象之后,我实现了一个部分类,它实现了UserManager
类使用的IUser
。 我想我的Id
是int
而不是string,所以我只是返回UserID的toString()。 同样,我希望Username
n
不是大写字母。
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
您现在编写自己的UserStore
,它处理用户,声明,angular色等的所有存储。实现代码优先UserStore
所做的所有操作的接口,并更改where TUser : IdentityUser
where TUser : User
,其中“User”是您的实体对象
public class MyUserStore<TUser> : IUserLoginStore<TUser>, IUserClaimStore<TUser>, IUserRoleStore<TUser>, IUserPasswordStore<TUser>, IUserSecurityStampStore<TUser>, IUserStore<TUser>, IDisposable where TUser : User { private readonly MyAppEntities _context; public MyUserStore(MyAppEntities dbContext) { _context = dbContext; } //Interface definitions }
以下是一些接口实现的几个例子
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(); }
使用MVC 5模板,我改变了AccountController
,看起来像这样。
public AccountController() : this(new UserManager<User>(new MyUserStore<User>(new MyAppEntities()))) { }
现在login应该与你自己的表一起工作。
看看这个项目在GitHub: https : //github.com/KriaSoft/AspNet.Identity
包括:
- SQL数据库项目模板为ASP.NET身份2.0
- entity framework数据库 – 第一提供者
- 源代码和示例
另请参阅 : 如何为ADO.NET标识创build数据库优先提供程序
我花了几个小时的时间来完成这个工作,最终find了我在这里的博客上分享的解决scheme。 基本上,你需要做的一切说臭气的答案,但有一个额外的事情:确保身份框架有一个特定的SQL客户端连接string顶部的entity framework连接string用于您的应用程序实体。
总之,您的应用程序将使用Identity Framework的连接string,另一个用于应用程序实体。 每个连接string都是不同的types。 阅读我的博客文章的完整教程。
好问题。
我更像是一个数据库第一人。 代码第一范式对我来说似乎松散,而“迁移”似乎太容易出错。
我想定制aspnet标识模式,而不是被迁移困扰。 我非常熟悉Visual Studio数据库项目(sqlpackage,data-dude)以及它在升级模式方面做得如何。
我简单的解决scheme是:
1)创build一个反映aspnet身份模式的数据库项目2)使用该项目的输出(.dacpac)作为项目资源3)在需要时部署.dacpac
对于MVC5,修改ApplicationDbContext
类似乎得到这个去…
1)实现IDatabaseInitializer
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext> { ... }
2)在构造函数中,表示这个类将实现数据库初始化:
Database.SetInitializer<ApplicationDbContext>(this);
3)实现InitializeDatabase
:
在这里,我select使用DacFX并部署我的.dacpac
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); } } }
我们有一个实体模型DLL项目,我们保持我们的模型类。 我们还保留一个包含所有数据库脚本的数据库项目。 我的做法如下
1)创build自己的项目,首先使用数据库的EDMX
2)脚本您的数据库中的表,我用VS2013连接到本地数据库(数据连接),并将脚本复制到数据库项目,添加任何自定义列,例如BirthDate [date]不空
3)部署数据库
4)更新模型(EDMX)项目添加到模型项目
5)将任何自定义列添加到应用程序类
public class ApplicationUser : IdentityUser { public DateTime BirthDate { get; set; } }
在MVC项目AccountController中添加了以下内容:
身份提供者需要一个SQL连接string来使其工作,为数据库只保留一个连接string,从EF连接string中提取提供者string
public AccountController() { var connection = ConfigurationManager.ConnectionStrings["Entities"]; var entityConnectionString = new EntityConnectionStringBuilder(connection.ConnectionString); UserManager = new UserManager<ApplicationUser>( new UserStore<ApplicationUser>( new ApplicationDbContext(entityConnectionString.ProviderConnectionString))); }
我发现@ JoshYates1980确实有最简单的答案。
经过一系列的试验和错误,我做了什么乔希build议,并用我生成的数据库连接stringreplaceconnectionString。 我最初困惑的是以下的post:
如何将ASP.NET MVC5身份validation添加到现有的数据库
@Win接受的答案表示要更改ApplicationDbContext()
连接名称。 如果您正在使用Entity和数据库/模型第一种方法(其中生成数据库连接string并将其添加到Web.config
文件中),这有点含糊不清。
ApplicationDbContext()
连接名称被映射到Web.config
文件中的默认连接。 因此,Josh的方法效果最好,但为了使ApplicationDbContext()
更具可读性,我build议将@Win最初发布的名称更改为数据库名称,确保更改Web.config
“DefaultConnection”的connectionString
和comment和/或移除实体生成的数据库包括。
代码示例: