如何与 asp 身份用户建立一对多关系
How to make one-to-many relationship with asp identity users
我使用带有 MVC + Identity 的默认 Web 应用程序来管理用户,并且我试图让每个注册用户制作他的电影列表并且在登录时只能看到他的列表。
所以,以我为例,我制作了一部电影class
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);
}
如果有人遇到过我的问题,请提供帮助,欢迎并非常感谢任何意见。
首先,您应该将 link 更改为 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);
}
无需写入调试 window,您可以 return 电影视图,就像您在自己的代码中所做的那样。
-
我还建议您使用视图模型来发送数据 to/from 您的观点。您现在执行此操作的方式可能会将整个数据库发送到您的视图(取决于您的查询 ofc)。您还将对向用户显示的内容进行更精细的控制。 (您可以阅读以下内容:what-is-viewmodel-in-mvc 以帮助您入门)
您需要在影片 class 中再添加一个 属性 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);
}
我使用带有 MVC + Identity 的默认 Web 应用程序来管理用户,并且我试图让每个注册用户制作他的电影列表并且在登录时只能看到他的列表。
所以,以我为例,我制作了一部电影class
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);
}
如果有人遇到过我的问题,请提供帮助,欢迎并非常感谢任何意见。
首先,您应该将 link 更改为 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);
}
无需写入调试 window,您可以 return 电影视图,就像您在自己的代码中所做的那样。
- 我还建议您使用视图模型来发送数据 to/from 您的观点。您现在执行此操作的方式可能会将整个数据库发送到您的视图(取决于您的查询 ofc)。您还将对向用户显示的内容进行更精细的控制。 (您可以阅读以下内容:what-is-viewmodel-in-mvc 以帮助您入门)
您需要在影片 class 中再添加一个 属性 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);
}