ASP.NET MVC 3使用Entity Framework Code First方法在表中存储其他用户信息

时间:2012-04-25 13:43:05

标签: asp.net-mvc entity-framework asp.net-membership membership-provider

对于ASP.NET MVC,我是一个新手,所以如果有人能够提供以下方案的指导,那就太棒了。

借助一种情况,可以有两种类型的成员可以注册到网站,客户和供应商。

每种类型都是一个成员,其附加信息存储在单独的模型/表(即客户模型/表,供应商模型/表)中,以及默认成员凭证(用户名,电子邮件,密码)。不确定最好的方法。欢迎任何建议?

每种类型都有一个单独的注册页面,一旦成功注册,它们将被添加到各自的角色(即客户,供应商)。

这是我正在玩的客户端模型。

public class Client
{
  // Will set this manually when creating a Client member
  [DatabaseGenerated(DatabaseGeneratedOption.None)]
  public int ClientId { get; set; }
  public string FirstName { get; set; }
  public string LastName { get; set; }
}

目前我已创建了一个ViewModel,用于处理客户端的注册

public class RegisterClient
{
  // Default ASP.NET MVC RegisterModel
  public RegisterModel RegisterModel { get; set; }
  public Client Client { get; set; }
}

以下是ClientController中的Register方法

public ActionResult Register()
{
  return View();
}

[HttpPost]
public ActionResult Register(RegisterClient model)
{
  if (ModelState.IsValid)
  {
    // Attempt to register the user
    MembershipCreateStatus createStatus;
    Membership.CreateUser(model.RegisterModel.UserName, model.RegisterModel.Password, model.RegisterModel.Email, null, null, true, null, out createStatus);

    if (createStatus == MembershipCreateStatus.Success)
    {
      FormsAuthentication.SetAuthCookie(model.RegisterModel.UserName, false /* createPersistentCookie */);
      Roles.AddUserToRole(model.RegisterModel.UserName, "Client");
      // Get UserId for Client <-> User relationship
      int id = int.Parse(Membership.GetUser(model.RegisterModel.UserName).ProviderUserKey.ToString());
      model.Client.UserProfileId = id;
      db.Clients.Add(model.Client);
      db.SaveChanges();
      return RedirectToAction("Index", "Home");
    }
    else
    {
      ModelState.AddModelError("", createStatus.ToString());
    }
  }
  // If we got this far, something failed, redisplay form
  return View(model);
}

这是一种合适的方法吗?我在考虑让Client模型继承MembershipUser。

如何创建客户端的页面列表及其成员资格(即用户名和电子邮件)?

1 个答案:

答案 0 :(得分:1)

我开发了一个具有两级用户的系统,并且存储类型特定信息的最简单方法是拥有单独的表,然后为它们分配链接信息,过去我为所有用户分配了一个客户ID,然后也将它记录在类型特定的表中。当我想查找他们的信息时,我会检查用户的客户ID,然后根据要访问的记录的ID进行检查。

我的情况我会在客户端和供应商模型中添加一个关联id列。关联ID可以是用户名,但我发现最好的方法是有一个单独的用户表,将asp.net成员资格中的用户名链接到关联ID。然后,您可以通过在两个表中查找当前用户关联ID来轻松检查用户是客户还是供应商。这种方法意味着后者如果您的供应商或客户拥有许多用户帐户,他们都可以访问同一组数据。您仍然可以使用ASP.Net成员资格角色来执行部分授权,但在向用户显示记录之前,您应该检查相关ID。

更新02/05/2012:

您可以为您的用户和客户创建模型,如下图所示。

public class User
{
    public int UserId{ get; set; }
    //This is from ASP.Net Membership
    public string Username { get; set; }
    public int AssosiateId { get; set; }
}

public class Client
{
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int ClientId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    //This is the ID of the Assosiate - the same as the user's assosiate id
    public int AssosiateId { get; set; }
}

您可以为供应商创建一个类似于上述客户的类。