1

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

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。

4

2 回答 2

0

Note您定义关系的方式是在 a和 a之间创建一对一的关系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);
于 2013-07-19T18:38:39.360 回答
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();
于 2013-07-22T15:13:37.397 回答