在我的应用程序中使用用户ID的方法是什么?

时间:2014-07-18 01:46:33

标签: c# asp.net-mvc database-design

相关内容如下:Best practice to maintain a user id (MVC)

通过IdentityDbContext提供的身份验证服务非常适合我的Web应用程序。我能够添加我希望每个用户拥有的字段,并且所有内容都打包得很好(所以我不必对身份验证进行大的更改)。此商品包中包含一个位于AspNetUsers中的ApplicationUser_Id。我的问题是,我是否应该在整个应用程序中使用ApplicationUser_Id作为我的用户ID,我应该填充一个单独的非身份表来保存我的用户ID吗?

我很乐意,如果有类似情况的人可以解释他们选择其中一种的思维过程(或完全不同的用法!)


修改

作为请求,我需要从我的WebForms应用程序转换到MVC(出于可伸缩性的原因)。以前在我的WebForms应用程序中,我有一个包含许多表的数据库。这些表中的大多数是联合表,其中我使用userId作为外键。在我之前的应用程序中,我将用户信息存储在名为Users的表中,后续数据存储在UserHasMonitorUserHasKeyboardUserHasCPU等中。我还有表格MonitorKeyboardCPU

我的WebForms应用程序用于记录用户及其拥有的计算机部件。每个实体(例如监视器或键盘)都保存在自己的表中。使用联合表将表连接在一起,并通过查询联合表来显示数据。

自从转向MVC以来,我想利用MVC提供的Identity附带的内置身份验证。有了这个,我得到一个唯一的userId和密码哈希以及我发现我需要的其他字段。但是,因为这是一个新的球赛,我的问题是我现在应该如何使用我的用户ID,因为它在身份提供者中,而不是像我以前那样的自定义Users表?

我现在设置了我的MVC应用程序,有2个连接字符串。一个连接字符串处理所有Identity表工作,而我的另一个连接字符串将处理我的联合表。

所以,把它煮沸:

  1. 如何将用户ID与也使用许多联合表的MVC应用程序集成?单独的连接字符串?两个独立的数据库?

  2. 我是否应该使用虚拟连接我的表(在我的模型中),因为我正在使用身份表;这会改变我的联合表的样子吗?

  3. 任何代码示例总是很好,我环顾四周但没有找到一个定义良好的程序,所以这就是为什么我的问题就在这里。

1 个答案:

答案 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; }
}