使用EF Database First MVC5的ASP.NET标识

Pat*_*ran 87 asp.net asp.net-mvc ef-database-first asp.net-mvc-5 asp.net-identity

是否可以将新的Asp.net标识与Database First和EDMX一起使用?或者只使用代码?

这是我做的:

1)我创建了一个新的MVC5项目并让新的Identity在我的数据库中创建了新的User和Roles表.

2)然后我打开了我的Database First EDMX文件并拖入了新的Identity Users表,因为我有其他与之相关的表.

3)保存EDMX后,Database First POCO生成器将自动创建User类.但是,UserManager和RoleManager需要从新的Identity命名空间(Microsoft.AspNet.Identity.IUser)继承User类,因此使用POCO User类将不起作用.

我想一个可能的解决方案是编辑我的POCO生成类以使我的User类继承自IUser?

或者ASP.NET Identity仅与Code First Design兼容?

++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

更新:根据Anders Abel的建议,这就是我所做的.它的工作原理,但我想知道是否有更优雅的解决方案.

1)我通过在与自动生成的实体相同的命名空间中创建一个部分类来扩展我的实体User类.

namespace MVC5.DBFirst.Entity
{
    public partial class AspNetUser : IdentityUser
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

2)我将DataContext更改为继承IdentityDBContext而不是DBContext.请注意,每次更新EDMX并重新生成DBContext和Entity类时,都必须将其设置为此.

 public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser>  //DbContext
Run Code Online (Sandbox Code Playgroud)

3)在自动生成的User实体类中,必须将override关键字添加到以下4个字段中,或者将这些字段注释掉,因为它们是从IdentityUser继承的(步骤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; }
Run Code Online (Sandbox Code Playgroud)

And*_*bel 16

应该可以将身份系统与POCO和Database First一起使用,但您必须进行一些调整:

  1. 更新.tt文件以生成POCO以生成实体类partial.这将使您可以在单独的文件中提供其他实现.
  2. User在另一个文件中部分实现该类

 

partial User : IUser
{
}
Run Code Online (Sandbox Code Playgroud)

这将使User类实现正确的接口,而不会触及实际生成的文件(编辑生成的文件总是一个坏主意).

  • 还有什么解决方案还不是黑客攻击吗? (4认同)

Jos*_*980 13

我的步骤非常相似,但我想分享.

1)创建一个新的MVC5项目

2)创建一个新的Model.edmx.即使它是一个新的数据库,也没有表.

3)编辑web.config并替换生成的connectionstring:

<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" />
Run Code Online (Sandbox Code Playgroud)

使用此连接字符串:

<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;database=SSFInventory;integrated security=true;" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

然后,构建并运行应用程序.注册用户,然后将创建表.


sti*_*ink 10

编辑: 使用EF数据库的ASP.NET身份首先用于MVC5 CodePlex项目模板.


我想使用现有数据库并与ApplicationUser建立关系.这就是我使用SQL Server的方式,但同样的想法可能适用于任何数据库.

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

编辑:Asp.Net Identity Class Diagram 在此输入图像描述

  • 我不是不愿意首先转向代码......只是在某些场景和公司中,db admin创建了基表,而不是编码器. (34认同)
  • 问题不是DBContext,而是UserManager和RoleManager期望一个继承自Microsoft.AspNet.Identity.EntityFramework.IdentityUser的类. (6认同)

Sho*_*hoe 8

IdentityUser这里没有价值,因为它是UserStore用于身份验证的代码优先对象.在定义了我自己的User对象之后,我实现了一个实现类IUser所使用的部分UserManager类.我希望我的Ids int代替字符串,所以我只返回UserID的toString().同样地,我想nUsername为小写形式.

public partial class User : IUser
{

    public string Id
    {
        get { return this.UserID.ToString(); }
    }

    public string UserName
    {
        get
        {
            return this.Username;
        }
        set
        {
            this.Username = value;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你绝不需要IUser.它只是一个使用的界面UserManager.因此,如果要定义不同的"IUser",则必须重写此类以使用自己的实现.

public class UserManager<TUser> : IDisposable where TUser: IUser
Run Code Online (Sandbox Code Playgroud)

您现在编写自己的UserStore,处理用户,声明,角色等的所有存储.实现代码优先的所有内容的接口,UserStore并更改where TUser : IdentityUserwhere 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
}
Run Code Online (Sandbox Code Playgroud)

以下是一些接口实现的几个示例

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();
}
Run Code Online (Sandbox Code Playgroud)

使用MVC 5模板,我将其更改AccountController为如下所示.

public AccountController()
        : this(new UserManager<User>(new MyUserStore<User>(new MyAppEntities())))
{
}
Run Code Online (Sandbox Code Playgroud)

现在登录应该适用于您自己的表.