我浏览了几个教程,似乎他们都忽略了如何利用登录用户将信息存储到数据库。为了帮助我说明我的观点,这是我一直在使用的模型。
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);
然而,这出乎意料地失败了。那么有人可以提供一个将UserProfile对象存储在数据库中其他对象的好方法的示例吗?基本上,我只需要一个很好的示例,现在可以显示UserProfile对象可以链接到Note对象,以及如何正确查询特定UserId的Notes。
答案 0 :(得分:0)
您定义关系的方式是,您要在Note
和User
之间建立一对一的关系。根据您遇到问题的查询,我希望用户可以拥有多个笔记。因此,为了在用户和他们的笔记之间创建一对多,您应该在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();