2015-12-09 93 views
0

我正在创建一个简单的Web应用程序,允许登录的用户存储不与其他用户共享的数据。数据库应用程序。将数据添加到登录用户仅对登录的用户可见

我无法将数据关联到用户。

这个模型看起来是这样的:

namespace TvShowsDb.Models 
{ 
    public class TvShow 
    { 
     public int TvShowID { get; set; } 
     public string TvShowName { get; set; } 
     public string LastEpisodeSeen { get; set; } 
     public string Comment { get; set; } 
     public bool SeenAll { get; set; } 
     public DateTime DateAdded { get; set; } 
     public DateTime DateLastEdited { get; set; } 

    } 
} 

而且从ASP.NET MVC5生成的用户模型看起来是这个样子我补充:

namespace TvShowsDb.Models 
{ 
    public class ApplicationUser : IdentityUser 
    { 
     [Required] 
     public string FirstName { get; set; } 

     [Required] 
     public string LastName { get; set; } 

     public IList<TvShow> TvShows { get; set; } 

     public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) 
     { 
      // Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType 
      var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie); 
      // Add custom user claims here 
      return userIdentity; 
     } 
    } 

    public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
    { 
     public ApplicationDbContext() 
      : base("DefaultConnection", throwIfV1Schema: false) 
     { 
     } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 

     public System.Data.Entity.DbSet<TvShowsDb.Models.TvShow> TvShows { get; set; } 
    } 
} 

我想实现的是,当登录的用户转到创建电视节目网页并创建tvshow,然后该特定的电视节目和来自该模型的数据被添加到用户。我有一个在用户电视节目列表。

这里是数据库的外观图片: Database look

这里是当我添加一个tvshow代码:

// POST: TvShows/Create 
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598. 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "TvShowID,TvShowName,LastEpisodeSeen,Comment,SeenAll,DateAdded,DateLastEdited")] TvShow tvShow) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = UserManager.FindById(User.Identity.GetUserId()); 
      IList<TvShow> tvshows = user.TvShows; 
      user.TvShows.Add(tvShow); 
      // db.TvShows.Add(tvShow); 
      db.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 

     return View(tvShow); 
    } 

我得到的用户,即工作并返回正确的用户。然后我得到电视节目列表,它返回null。然后,添加失败,因为tvshow列表为空。

我该如何着手将tvshows添加到用户,以便我可以将它们显示在该特定用户的索引页上?

回答

2

尝试直接访问用户表,包括子集合:

var id = User.Identity.GetUserId(); 
var user = db.Users.Include(u => u.TvShows).Single(u => u.Id == id); 
+0

这给了我一个错误在该行:“LINQ到实体无法识别方法“System.String GetUserId(System.Security。 Principal.IIdentity)'方法,并且此方法不能转换为商店表达式。“ – Sigmundur

+0

在查询之前定义用户 - 'var ID = User.Identity.GetUserId(); var user = db.Users.Include(u => u.TvShows).Single(u => u.Id == ID);' –

+0

斯蒂芬,是的,它的工作原理。我很想解释为什么这会起作用。此外,这是访问用户和他的数据的标准方式吗? 如果史蒂夫更新他的答案包括斯蒂芬斯改变,那么我会将其标记为正确的答案。如果斯蒂芬对他的评论作出回答,那么我会将其标记为接受的答案。 谢谢你们。 – Sigmundur

相关问题