相关内容如下:Best practice to maintain a user id (MVC)
通过IdentityDbContext提供的身份验证服务非常适合我的Web应用程序。我能够添加我希望每个用户拥有的字段,并且所有内容都打包得很好(所以我不必对身份验证进行大的更改)。此商品包中包含一个位于AspNetUsers中的ApplicationUser_Id。我的问题是,我是否应该在整个应用程序中使用ApplicationUser_Id作为我的用户ID,或我应该填充一个单独的非身份表来保存我的用户ID吗?
我很乐意,如果有类似情况的人可以解释他们选择其中一种的思维过程(或完全不同的用法!)
修改
作为请求,我需要从我的WebForms应用程序转换到MVC(出于可伸缩性的原因)。以前在我的WebForms应用程序中,我有一个包含许多表的数据库。这些表中的大多数是联合表,其中我使用userId作为外键。在我之前的应用程序中,我将用户信息存储在名为Users
的表中,后续数据存储在UserHasMonitor
,UserHasKeyboard
,UserHasCPU
等中。我还有表格Monitor
,Keyboard
和CPU
。
我的WebForms应用程序用于记录用户及其拥有的计算机部件。每个实体(例如监视器或键盘)都保存在自己的表中。使用联合表将表连接在一起,并通过查询联合表来显示数据。
自从转向MVC以来,我想利用MVC提供的Identity附带的内置身份验证。有了这个,我得到一个唯一的userId和密码哈希以及我发现我需要的其他字段。但是,因为这是一个新的球赛,我的问题是我现在应该如何使用我的用户ID,因为它在身份提供者中,而不是像我以前那样的自定义Users
表?
我现在设置了我的MVC应用程序,有2个连接字符串。一个连接字符串处理所有Identity表工作,而我的另一个连接字符串将处理我的联合表。
所以,把它煮沸:
如何将用户ID与也使用许多联合表的MVC应用程序集成?单独的连接字符串?两个独立的数据库?
我是否应该使用虚拟连接我的表(在我的模型中),因为我正在使用身份表;这会改变我的联合表的样子吗?
任何代码示例总是很好,我环顾四周但没有找到一个定义良好的程序,所以这就是为什么我的问题就在这里。
答案 0 :(得分:1)
除了它看起来有点奇怪之外,我认为在应用程序中使用该ID没有问题,它仍然是用户的主键。
如果你不喜欢那种ID,那么一个单独的表将是一个灾难性的想法,而你可以让ASP.NET Identity使用Integers作为主键,查看this article,它也可以帮助你了解身份如何运作以及如何扩展身份。
==========
修改强>
由于我无法在你的帖子下发表评论,我希望你能看到这一点。
如何将用户ID与也使用许多联合表的MVC应用程序集成?单独的连接字符串?两个独立的数据库?
答案是单个连接字符串,单个数据库和上下文,从DbContext继承NOT,但是从IdentityDbContext继承。例如(假设您使用代码优先迁移):
public class yourContext : IdentityDbContext<ApplicationUser>
{
static yourContext()
{
Database.SetInitializer<yourContext>(new MigrateDatabaseToLatestVersion<yourContext, Configuration>());
}
public yourContext()
: base("Name=YourConnectionString")
{
}
}
从IdentityDbContext继承将创建Identity在当前数据库中工作所需的db表。
我是否应该使用虚拟连接我的表(在我的模型中),因为我正在使用身份表;这会改变我的联合表的样子吗?
您应该像往常一样在OnModelCreating方法中创建表关系(例如Fluent API)
任何代码示例总是很好,我已经环顾四周但是没有 找到了一个定义良好的程序,这就是我的问题所在 这里。
以下是我将Identity用户与联系人联系的方式:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ApplicationUser>().HasRequired(c => c.Contact)
.WithMany()
.HasForeignKey(c => c.ContactId);
base.OnModelCreating(modelBuilder);
}
在我的ApplicationUser类中(从IdentityUser派生)我有这个:
public class ApplicationUser : IdentityUser
{
public int ContactId { get; set; }
public virtual Contact Contact { get; set; }
}