【发布时间】:2013-11-25 05:47:59
【问题描述】:
是否可以将新的 Asp.net Identity 与 Database First 和 EDMX 一起使用?还是只有代码优先?
这就是我所做的:
1) 我创建了一个新的 MVC5 项目,并让新的身份在我的数据库中创建了新的用户和角色表。
2) 然后我打开我的 Database First EDMX 文件并拖入新的 Identity Users 表,因为我还有其他与之相关的表。
3) 保存 EDMX 后,Database First POCO 生成器将自动创建一个 User 类。但是,UserManager 和 RoleManager 需要一个继承自新 Identity 命名空间 (Microsoft.AspNet.Identity.IUser) 的 User 类,因此无法使用 POCO User 类。
我想一个可能的解决方案是编辑我的 POCO 生成类以让我的用户类继承自 IUser?
还是 ASP.NET 标识仅与代码优先设计兼容?
++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++
更新:按照 Anders Abel 下面的建议,这就是我所做的。它有效,但我想知道是否有更优雅的解决方案。
1) 我通过在与自动生成的实体相同的命名空间中创建部分类来扩展我的实体用户类。
namespace MVC5.DBFirst.Entity
{
public partial class AspNetUser : IdentityUser
{
}
}
2) 我将 DataContext 更改为继承自 IdentityDBContext 而不是 DBContext。请注意,每次更新 EDMX 并重新生成 DBContext 和 Entity 类时,都必须将其设置回 this。
public partial class MVC5Test_DBEntities : IdentityDbContext<AspNetUser> //DbContext
3) 在自动生成的 User 实体类中,您必须将 override 关键字添加到以下 4 个字段或将这些字段注释掉,因为它们是从 IdentityUser 继承的(步骤 1)。请注意,每次更新 EDMX 并重新生成 DBContext 和 Entity 类时,都必须将其设置回 this。
override public string Id { get; set; }
override public string UserName { get; set; }
override public string PasswordHash { get; set; }
override public string SecurityStamp { get; set; }
【问题讨论】:
-
您有实现的示例代码吗?当我尝试复制上述内容时,当我尝试登录或注册用户时出现错误。“实体类型 AspNetUser 不是当前上下文模型的一部分”其中 AspNetUser 是我的用户实体
-
您是否将 AspNetUser 表添加到您的 EDMX?另外,请确保您的 AccountController 使用的是 MVC5Test_DBEntities(或任何您的数据库上下文命名)而不是 ApplicationContext。
-
ASP.NET Identity 是一堆热气腾腾的____。对数据库优先的可怕支持,没有文档,引用约束差(在 SQL 服务器上缺少 ON CASCADE DELETE)并使用字符串作为 ID(性能问题和索引碎片)。这是他们对身份框架的第 297 次尝试……
-
@DeepSpace101 Identity 支持 DB-first 和 Code-first 一样。模板设置为代码优先,因此如果您从模板开始,则必须更改一些内容。级联删除工作得很好,您可以轻松地将字符串更改为整数。请参阅下面的答案。
-
@Shoe 我不得不说我认为你可能错了。我还没有找到一个关于如何在 db-first 中实现它的有效的、全面的示例/教程(没有文档)。 API 尝试通过属性 IdentityUser.Roles 引用联结表“IdentityUserRoles”,这会破坏 EF db-first 上的关系,因为联结表没有作为实体公开(参考约束不佳)。我不同意 ID 的字符串,因为可以通过在继承的类中指定类型参数来自定义它。总而言之,在我看来,他们根本没有首先考虑 DB。
标签: asp.net asp.net-mvc asp.net-mvc-5 ef-database-first asp.net-identity