SimpleAuthentication - 将用户特定信息存储到数据库

时间:2013-07-19 18:34:10

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

我浏览了几个教程,似乎他们都忽略了如何利用登录用户将信息存储到数据库。为了帮助我说明我的观点,这是我一直在使用的模型。

public class Note
{
        public int ID { get; set; }
        public int UserId { get; set; }
        public string Text { get; set; }
}

每个用户都可以为数据库写一个注释。当我为此模型创建CRUD控制器时,我在执行更新/创建时将 UserId 属性更新为 WebSecurity.CurrentUserId 。然后在检索数据时,我使用linq表达式中的Where过滤注释。出于某种原因,这感觉不对。

通过更多的例子,我偶然发现有人这样做。

public class Note
{
        public int ID { get; set; }
        public virtual UserProfile User { get; set; } 
        public string Text { get; set; }
}
public class NoteDbContext : DbContext
{
    public DbSet<Note> Notes { get; set; }
}

由于模型在C#中正确链接,因此看起来更清晰。哇,它真的建立了!所以现在在我的控制器中,我将首先从数据库中获取用户对象,然后使用Where列表中的注释。

//First get the logged in user
var user = dbUser.UserProfiles.Where(x => x.UserId == WebMatrix.WebData.WebSecurity.CurrentUserId).First();
//Now get all their notes
var notes = db.Notes.Where(x => x.User == user);

Failure Message

然而,这出乎意料地失败了。那么有人可以提供一个将UserProfile对象存储在数据库中其他对象的好方法的示例吗?基本上,我只需要一个很好的示例,现在可以显示UserProfile对象可以链接到Note对象,以及如何正确查询特定UserId的Notes。

2 个答案:

答案 0 :(得分:0)

您定义关系的方式是,您要在NoteUser之间建立一对一的关系。根据您遇到问题的查询,我希望用户可以拥有多个笔记。因此,为了在用户和他们的笔记之间创建一对多,您应该在UserProfile对象上创建一个集合。例如,

public class UserProfile
{
   ...
   public List<Note> Notes {get; set;}
}

...并查询,加载与该用户相关联的Notes

var user = myUsers.Include(n=>n.Notes)
                  .Single(x => x.UserId == WebMatrix.WebData.WebSecurity.CurrentUserId);

答案 1 :(得分:0)

每个用户都可以有很多笔记,对吧?如果是这样,请更改您的课程:

public class Note
{        
    public int ID { get; set; }
    public int UserId { get; set; }
    public string Text { get; set; }

    public virtual UserProfile User { get; set; }
}

[Table("UserProfile")]
public class UserProfile
{
    public UserProfile()
    {
        this.Notes = new HashSet<Note>();
    }

    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }

    public virtual ICollection<Note> Notes{ get; set; }
}

现在,让用户和笔记正确连接。因此,您可以轻松实现目标,如下所示。您也不需要与WebMatrix.WebData.WebSecurity一起努力获取当前用户!只需使用User.Identity.Name

// ...
var notes = db.Notes.Where(x => x.User.UserName == User.Identity.Name).AsQueryable();