1

我在 MVC4 中使用 simplemembership,效果很好,但是我需要添加其他用户详细信息,例如名字和姓氏、电子邮件、国家/地区,每个用户可以有多个配置文件,所以我从 UserProfile 表中的用户表添加 ID {FK} . 用户注册时我有单独的表格,系统调用另一个表格询问其他详细信息。我正在使用代码优先现有数据库方法

我错过了如何存储附加信息以及使用 LINQ 对其用户配置文件进行存储的难题。

提前谢谢了 ..

数据库:

CREATE TABLE [dbo].[UserProfile] (
[UserId]   INT            IDENTITY (1, 1) NOT NULL,
[UserName] NVARCHAR (150) NOT NULL,
[ID]       INT            NOT NULL,
PRIMARY KEY CLUSTERED ([UserId] ASC),
FOREIGN KEY ([ID]) REFERENCES [dbo].[Users] ([ID])
);

CREATE TABLE [dbo].[Users] (
[ID]         INT            IDENTITY (1, 1) NOT NULL,
[Email]      NVARCHAR (150) NOT NULL,
[First_Name] NVARCHAR (150) NOT NULL,
[Last_Name]  NVARCHAR (150) NOT NULL,
[Country]    NVARCHAR (150) NOT NULL,
PRIMARY KEY CLUSTERED ([ID] ASC)
);

控制器类

  [HttpGet]
    [Authorize]
    public ActionResult UserDetail()
    {

        return View();
    }

    [HttpPost]
    [Authorize]
    [ValidateAntiForgeryToken]
    public ActionResult UserDetail(User model)
    {

        using (var db = new DB5Context_01())
        {
            var user_info = new User
            {
                First_Name = model.First_Name,
                Last_Name = model.Last_Name,
                Country = model.Country,
                Email = model.Email
            };

           //// need help here ??? hock Userprofile with User

        }

SimpleMemberShip 初始化

namespace Simple_LoginSystem_05.Filters
{
public class InitializeSimpleMembership : ActionFilterAttribute
{
    public InitializeSimpleMembership()
    {
        try
        {
            if (!WebSecurity.Initialized)
            {
                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
        }
    }
}
}

模型

  public partial class User
{
    public User()
    {
        this.UserProfiles = new HashSet<UserProfile>();
    }

    public int ID { get; set; }
    public string Email { get; set; }
    public string First_Name { get; set; }
    public string Last_Name { get; set; }
    public string Country { get; set; }

    public virtual ICollection<UserProfile> UserProfiles { get; set; }
4

1 回答 1

0

SimpleMembership 期望每个用户有一个“UserProfile”,它存储在您在调用时指定的表中:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

在默认代码中,该表称为“UserProfile”,与UserProfilein匹配AccountModels.cs。有关. _ _UserProfile

我还应该注意,如果不是出于您的要求“每个用户可以拥有多个配置文件”,那么您通常只需将电子邮件、名字、姓氏、国家等属性添加到UserProfile类中。我还将该类移出UsersContext我自己的上下文,删除UsersContext并更新对UsersContext我自己的上下文的引用AccountControllerInitializeSimpleMembershipAttribute(您甚至可以将电子邮件设置为登录令牌,而不是UserName使用这种方法)。

因此,虽然我不明白单个用户如何需要多个名字等,但假设您有充分的理由这样做,那么对于您的实例,您将不得不引入新术语,例如:

  • UserProfile- 保留 SimpleMembership 的含义,UserProfile因为它将更容易阅读文档。此表中每次登录将有一条记录。
  • AttributesForUser- 我将用它来描述您的要求“额外的用户详细信息,例如名字和姓氏、电子邮件、国家/地区以及每个用户可以拥有多个个人资料的限制”。看起来这与您User上面的表格相对应。使用User此表的名称将导致与User成员资格和WebSecurity框架方法和属性发生冲突,因此可能不是最好的主意。表中的每个条目都可以在表UserProfiles中具有一个或多个条目AttributesForUsers

看起来您已经对代码优先的详细信息进行了排序。您的示例public virtual ICollection<UserProfile> UserProfiles { get; set; }是正确的,但您可以将其更改为:

public virtual ICollection<AttributesForUser> AttributesForUser { get; set; }

然后您的AttributesForUser(您也将其作为 DbSet 添加到数据上下文中)将如下所示:

public class AttributesForUser
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public int UserId { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
    [Required]
    public string Country { get; set; }
    [Required]
    public string Email { get; set; }

    [ForeignKey("UserId")]
    public UserProfile UserProfile { get; set; }
}

创建用户时,您可以执行以下操作:

using (MyContextdb = new MyContext())
{
  WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
  // assumes you have moved UserProfile to MyContext, alter code accordingly if not
  UserProfile userProfile = db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == model.UserName.ToLower());
  AttributesForUser newAttribs = new AttributesForUser { 
    UserId = userProfile.UserId,
    ... fill in other properties here ... 
  };
  db.AttributesForUsers.Add(newAttribs);
  // do as many more newAttribs as you need for this userId
  ...
  // and now save
  db.SaveChanges();
}
于 2013-07-26T06:20:24.617 回答