显示仅与登录的用户相关的数据.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登录)
您需要一个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
也可以是User
,User
类继承自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
。