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

时间:2015-12-03 18:01:31

标签: c# asp.net asp.net-mvc entity-framework visual-studio

我正在开始一个爱好项目的工作,该项目只保留联系信息列表。大量的教程,但我正在寻找基于个人的联系人列表。因此,当有人使用提供的简单登录登录时,该用户将只看到与他/她关联的联系人。稍后我想添加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; }
    }
}

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

然后我考虑为每个用户准备一张桌子。这使得数据库更清洁,但是如果有很多用户的话会有很多表。我并不期待很多用户,我宁愿选择“正确”的方式而不是假设用户很少的黑客。

同样,我如何将每个用户的联系信息分开,以便我可以显示每个用户的相关信息?

干杯!

P.S。我按照this教程开始,并使其工作到我需要的扩展。 (例如,没有OAuth登录)

1 个答案:

答案 0 :(得分:1)

您需要一个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插入到用户表中。最后,您使用与此新UserContact表相同的外键的User表。通过这种方式,您可以确保只有在系统中标记为用户的人才能与联系人关联。您可能不希望能够将任何联系人与任何其他联系人联系起来 - 绝大多数联系人都不会登录您的系统。

我坦率地认为后一种想法是一个更好的方案。它被称为“超类型/子类型”模式,非常类似于结构化编程中的继承,其中Contact也可以是UserUser类继承自Contact。 1}}类。您甚至可以在代码中使这种继承的工作方式完全相同!

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类的子类。有关更多提示,请参阅A Universal Person and Organization Data Model

<强>更新

鉴于您使用预先存在的dbo.AspNetUsers表的新信息,您可以修改该表,使其功能类似于我上面建议的第二个User表,或者您可以省略新的User表,并按原样使用AspNetUsers表,指向它的多对多连接表,而不是我最初建议的User