我正在使用简单的会员和MVC4这很好用,但是我需要添加额外的用户详细信息,如名字和姓氏,电子邮件,国家/地区有限制,每个用户可以有多个配置文件,所以我从Users表添加ID {FK}在UserProfile表中。 当用户注册时,我有单独的表单,系统调用另一个表单询问额外的详细信息。我正在使用代码第一个现有的数据库方法
我想知道如何存储其他信息,并使用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
}
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; }
答案 0 :(得分:0)
SimpleMembership要求每个用户使用一个“UserProfile”,它存储在您在调用中指定的表中:
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
在默认代码中,该表名为“UserProfile”,与UserProfile
中的AccountModels.cs
匹配。有关UserProfile
的详细信息,请参阅my answer to this question的详细信息第4部分。
我还应该注意,如果不符合您的要求“每个用户可以有多个配置文件”,那么您通常只需将诸如Email,FirstName,LastName,Country等属性添加到{ {1}}课程。我还将该类从UserProfile
移到我自己的上下文中,删除UsersContext
并将UsersContext
中的引用更新为UsersContext
和AccountController
中我自己的上下文(您甚至可以set the Email as the login token使用此方法代替InitializeSimpleMembershipAttribute
。
因此,虽然我不明白单个用户如何需要多个FirstName等,但假设您有充分的理由,那么对于您的实例,您将不得不引入新的术语,例如:
UserName
- 保持这意味着SimpleMembership UserProfile
,因为这样可以更轻松地阅读文档。此表中每次登录将有一条记录。UserProfile
- 我将用此来描述您的要求“其他用户详细信息,如姓名,电子邮件,国家/地区,每个用户都可以拥有多个配置文件”。看起来这与您上面的AttributesForUser
表相对应。使用此表的名称User
将导致与成员资格和User
框架方法和属性的User
冲突,因此可能不是最好的主意。表WebSecurity
中的每个条目都可以在表UserProfiles
中包含一个或多个条目。看起来您已经对代码优先详细信息进行了排序。您AttributesForUsers
的示例是正确的,但您可以将其更改为:
public virtual ICollection<UserProfile> UserProfiles { get; set; }
然后你的public virtual ICollection<AttributesForUser> AttributesForUser { get; set; }
(你也将它作为DbSet添加到你的数据上下文中)看起来像:
AttributesForUser
创建用户时,您可以执行以下操作:
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; }
}