使用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中使用身份系统,但是你需要做一些调整:

  1. 更新POCO生成的.tt文件以使实体类成为partial 。 这将使您可以在另外的文件中提供额外的实施。
  2. 在另一个文件中部分实现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做的,但同样的想法可能适用于任何数据库。

  1. 创build一个MVC项目
  2. 打开Web.config中的DefaultConnection下列出的数据库。 它会被称为(aspnet- [时间戳]或类似的东西。)
  3. 脚本数据库表。
  4. 将脚本表插入到SQL Server Management Studio中的现有数据库中。
  5. 自定义和添加关系到ApplicationUser (如有必要)。
  6. 创build新的Web项目> MVC>数据库第一个项目>使用EF导入数据库…排除您插入的标识类。
  7. IdentityModels.cs中,更改ApplicationDbContext :base("DefaltConnection")以使用项目的DbContext。

编辑: Asp.Net身份类图 在这里输入图像说明

IdentityUser在这里没有价值,因为它是UserStore用于validation的代码优先对象。 在定义我自己的User对象之后,我实现了一个部分类,它实现了UserManager类使用的IUser 。 我想我的Idint而不是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和/或移除实体生成的数据库包括。

代码示例: