显示仅与登录的用户相关的数据.Asp.net MVC5

本文关键字:数据 Asp net MVC5 用户 登录 显示 | 更新日期: 2023-09-27 18:25:29

我正在着手一个爱好项目,该项目只保留一个联系人信息列表。有很多教程,但我正在寻找基于个人的联系人列表。因此,当有人使用提供的简单登录进行登录时,该用户将只看到与他/她相关联的联系人。稍后我想添加OAuth,但这是另一天的事。

如何将相关联系信息与特定登录信息联系起来?

我的数据模型如下:

namespace ContactManager.Models
{
    public class Contact
    {
        public int ContactId { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string Zip { get; set; }
        [DataType(DataType.EmailAddress)]
        public string Email { get; set; }
    }
}

首先,我想到了一个将用户与之关联的列。比如将用户的电子邮件存储在一个列中,每个联系人信息都属于每个用户。但这似乎很麻烦。

然后我考虑为每个用户设置一个表。这使得数据库更干净,但如果有很多用户,则会有很多表。我不期望有很多用户,我只是宁愿用"正确"的方式来做,而不是假设用户很少的黑客攻击。

那么,我如何将每个用户的联系信息分开,以便显示每个用户的相关信息呢?

干杯!

附言:我从本教程开始,并将其扩展到我需要的范围。(例如,没有OAuth登录)

显示仅与登录的用户相关的数据.Asp.net MVC5

您需要一个User表和一个UserContact表。假设SQL Server:

CREATE TABLE dbo.User (
   UserId int identity(1,1) NOT NULL CONSTRAINT PK_User PRIMARY KEY CLUSTERED,
   Name varchar(50) NOT NULL CONSTRAINT UQ_User_Name UNIQUE,
   EmailAddress varchar(254)
);
CREATE TABLE UserContact (
   // Do NOT add a surrogate key to this table. No identity column!
   UserId int NOT NULL
      CONSTRAINT FK_UserContact_UserId FOREIGN KEY REFERENCES dbo.User(UserId),
   ContactId int NOT NULL
      CONSTRAINT FK_UserContact_ContactId FOREIGN KEY REFERENCES dbo.Contact(ContactId),
   CONSTRAINT PK_UserContact PRIMARY KEY CLUSTERED (UserId, ContactId)
);

然后,您将用户链接到联系人,方法是在这个中间表中放入一行,其中包含相关实体的ID(称为多对多联接表)。

需要考虑的另一件事是,用户自己也有联系信息。所以你可以考虑这样做:

CREATE TABLE dbo.User (
   UserId int NOT NULL
      CONSTRAINT FK_User_UserId_ContactId FOREIGN KEY REFERENCE dbo.Contact(ContactId),
      CONSTRAINT PK_User PRIMARY KEY CLUSTERED
);

这意味着,在任何人成为用户之前,必须首先将其信息作为联系人输入。然后,将ContactId作为其UserId插入到User表中。最后,使用相同的UserContact表,该表具有与此新User表相同的外键。通过这种方式,您可以确保只有在您的系统中被标记为用户的人才能与联系人关联。你可能不想将任何联系人与任何其他联系人联系起来——你的绝大多数联系人都不会登录到你的系统中。

坦率地说,我认为后一种想法是一个更好的方案。它被称为"超类型/子类型"模式,很像结构化编程中的继承,其中Contact也可以是UserUser类继承自Contact类。您甚至可以在代码中以完全相同的方式进行这种继承!

public class User : Contact {
}
var contact = GetSomeContact();
var user = contact as User;
if (user != null) {
    // This is a user! Do some special handling
}

相反,您也可以考虑让它们都继承自Party类(尽管可能维护"User是Contact的子类"关系)。如果您将公司和组织放入联系人数据库,它们也将是Party类的子类。有关更多想法,请参阅通用人员和组织数据模型。

更新

考虑到使用预先存在的dbo.AspNetUsers表的新信息,您可以修改该表,使其功能类似于我上面建议的第二个User表,也可以省略新的User表,并使用AspNetUsers表,多对多联接表指向它,而不是像我一开始建议的那样指向User