首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >EF数据库ASP.NET Identity First MVC5

EF数据库ASP.NET Identity First MVC5
EN

Stack Overflow用户
提问于 2013-11-13 05:13:27
回答 5查看 58.5K关注 0票数 88

是否可以将新的Asp.net标识与数据库优先和EDMX一起使用?还是只使用代码优先?

下面是我所做的:

1)我创建了一个新的MVC5项目,并让新的身份在我的数据库中创建新的用户和角色表。

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

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

我想一个可能的解决方案是编辑我的POCO Generation类,让我的User类从IUser继承?

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

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

更新:遵循Anders Abel下面的建议,这就是我所做的。它是有效的,但我想知道是否有更优雅的解决方案。

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

代码语言:javascript
复制
namespace MVC5.DBFirst.Entity
{
    public partial class AspNetUser : IdentityUser
    {
    }
}

2)我将DataContext改为从IdentityDBContext继承,而不是从DBContext继承。请注意,每次更新EDMX并重新生成DBContext和实体类时,都必须将其设置回原处。

代码语言:javascript
复制
 public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser>  //DbContext

3)在自动生成的用户实体类中,必须将override关键字添加到以下4个字段或注释掉这些字段,因为它们是从IdentityUser继承的(步骤1)。请注意,每次更新EDMX并重新生成DBContext和实体类时,都必须将其设置回原处。

代码语言:javascript
复制
    override public string Id { get; set; }
    override public string UserName { get; set; }
    override public string PasswordHash { get; set; }
    override public string SecurityStamp { get; set; }
EN

回答 5

Stack Overflow用户

发布于 2014-05-22 01:48:36

我的步骤非常相似,但我想分享一下。

1)创建新的MVC5项目

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

3)编辑web.config,替换生成的连接字符串:

代码语言:javascript
复制
<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" />

使用此连接字符串:

代码语言:javascript
复制
<add name="DefaultConnection" connectionString="Data Source=.\SQLExpress;database=SSFInventory;integrated security=true;" providerName="System.Data.SqlClient" />

然后,构建并运行应用程序。注册一个用户,然后创建表。

票数 13
EN

Stack Overflow用户

发布于 2014-01-15 04:02:28

IdentityUser在这里毫无价值,因为它是UserStore用于身份验证的代码优先对象。在定义了我自己的User对象之后,我实现了一个实现UserManager类所使用的IUser的分部类。我希望我的Ids是int而不是string,所以我只返回UserID的toString()。同样,我希望Username中的n不大写。

代码语言:javascript
复制
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“,你必须重写这个类来使用你自己的实现。

代码语言:javascript
复制
public class UserManager<TUser> : IDisposable where TUser: IUser

现在,您可以编写自己的UserStore来处理用户、声明、角色等的所有存储。实现代码优先的UserStore所做的一切的接口,并将where TUser : IdentityUser更改为where TUser : User,其中"User“是您的实体对象

代码语言:javascript
复制
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
}

下面是一些接口实现的示例

代码语言:javascript
复制
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();
}

使用MVC5模板,我将AccountController更改为如下所示。

代码语言:javascript
复制
public AccountController()
        : this(new UserManager<User>(new MyUserStore<User>(new MyAppEntities())))
{
}

现在,登录应该可以使用您自己的表了。

票数 8
EN

Stack Overflow用户

发布于 2015-09-17 12:47:06

问得好。

我更像是一个数据库先行者。在我看来,代码优先的范例似乎不太可靠,而且“迁移”似乎太容易出错。

我想自定义aspnet身份模式,而不是为迁移而烦恼。我精通Visual Studio数据库项目(sqlpackage,data-dude),以及它在模式升级方面的出色表现。

我的简单解决方案是:

1)创建镜像.dacpac标识架构的数据库项目2)将此项目(.dacpac)的输出用作项目资源3)在需要时部署aspnet

对于MVC5来说,修改ApplicationDbContext类似乎可以让这一切顺利进行……

1)实现IDatabaseInitializer

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IDatabaseInitializer<ApplicationDbContext> { ... }

2)在构造函数中,发出这个类将实现数据库初始化的信号:

Database.SetInitializer<ApplicationDbContext>(this);

3)实现InitializeDatabase

在这里,我选择使用DacFX并部署我的.dacpac

代码语言:javascript
复制
    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);
            }
        }
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19940014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档