如何与asp身份用户建立一对多的关系

时间:2015-09-15 20:02:08

标签: asp.net-mvc entity-framework-6 asp.net-identity

我使用带有MVC + Identity的默认Web应用程序来管理用户,我试图让每个注册用户制作他的电影列表,并且在登录时只能看到他的列表。

所以,就我的例子而言,我制作了一部电影课

public class Movie
    {
        public int MovieId { get; set; }
        public string MovieName { get; set; }
        public string Year { get; set; }
        public string Genre { get; set; }

        public virtual ApplicationUser ApplicationUser { get; set; }
    }

在ApplicationUser中我放了

public virtual ICollection<Movie> Movies { get; set; }

有一个电影列表。

我还创建了一个Entity FrameWork MovieController,使用Movie作为模型,使用ApplicationDbContext作为上下文。

所以我在查询数据库时遇到问题,以便让每个用户只能查看他的电影列表,默认的脚手架我在MoviesController的索引操作中得到这个

 public ActionResult Index()
        {
            var movies = db.Movies.ToList();
            return View(movies);
        }

如果有任何人有我的问题的经验,请帮助,欢迎任何意见,并非常感谢。

2 个答案:

答案 0 :(得分:4)

您需要在ApplicationUserID的影片类中添加一个属性,以便在它们之间创建正确的关系,如下所示:

public class Movie
    {
        public int MovieId { get; set; }
        public string MovieName { get; set; }
        public string Year { get; set; }
        public string Genre { get; set; }

        public string ApplicationUserID { get;set; }        
        public virtual ApplicationUser ApplicationUser { get; set; }
    }

现在您可以为这样的用户获取所有电影:

public ActionResult Index()
        {
            ApplicationDbContext context = new ApplicationDbContext();
            string userid = User.Identity.GetUserId();
            IEnumerable<Movie> movies = new List<Movie>();
            if (!string.IsNullOrEmpty(userid))
            {
                movies = context.Movies.Where(x => x.ApplicationUserID == userid);
            }

            return View(movies);
        } 

答案 1 :(得分:2)

首先,您应该将指向applicationuser(从Movie)的链接更改为一个集合(多对多)。

public virtual ICollection<Movie> Movies { get; set; }

如果您想为登录用户提取电影列表,可以像这样获取用户和电影列表:

var user = UserManager.FindById(User.Identity.GetUserId());

Debug.WriteLine(user.Email);
var movies = user.Movies.ToList();
foreach (var movie in movies)
{
     Debug.WriteLine(movie.MovieName);
}

您可以返回一个包含您在自己的代码中完成的电影的视图,而不是写入调试窗口。

- 我还建议您使用视图模型向/从视图发送数据。您现在的方式可能会将整个数据库发送到您的视图(取决于您的查询)。您还可以对您向用户显示的内容进行更细粒度的控制。 (你可以读一下:what-is-viewmodel-in-mvc让你入门)