将LINQ中的数据存储到两个表中;加入LINQ

时间:2013-07-23 18:08:40

标签: c# linq simplemembership

我正在使用简单的会员和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

        }

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; }

1 个答案:

答案 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中的引用更新为UsersContextAccountController中我自己的上下文(您甚至可以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; }
}