ASP.NET MVC 如何使用 ApplicationUser 和其他域类之间的多对多关系
Posted
技术标签:
【中文标题】ASP.NET MVC 如何使用 ApplicationUser 和其他域类之间的多对多关系【英文标题】:ASP.NET MVC How to Use Many to Many Relationship Between ApplicationUser and Other Domain Class 【发布时间】:2021-02-06 04:32:45 【问题描述】:我目前正在使用 ASP.NET MVC,使用实体框架和代码优先方法进行项目。先行者,我对所有这些都很陌生,所以有些事情对我来说仍然没有多大意义。
我已经在 ApplicationUser 类和 Project 类之间建立了多对多的关系:
IdentityModels.cs:
public class ApplicationUser : IdentityUser
public ICollection<UserProject> UserProjects get; set;
项目.cs:
public class Project
[...]
public ICollection<UserProject> UserProjects get; set;
UserProject.cs:
public class UserProject
[Key, Column(Order = 1)]
public string UserId get; set;
[Key, Column(Order = 2)]
public int ProjectId get; set;
public ApplicationUser User get; set;
public Project Project get; set;
我为我的 ApplicationDbContext 创建了一个 UserProject 的 DbSet 并为此创建了一个迁移。
话虽如此,我的问题是我将如何使用这种关系?更具体地说,如果我只想显示登录用户分配到的项目,我该怎么做呢?
另外,我目前的假设是,如果我想将项目分配给用户,我最终只需要使用给定的用户 ID 和我想要分配给他们的项目 ID 创建一个新的 UserProject 对象。会是这样吗?
我对这种关系的配置是否设置得当,还是应该考虑更改它以获得上述功能?
感谢任何和所有帮助。谢谢!
【问题讨论】:
【参考方案1】:从上一个问题开始,关于配置
EF6 支持多对多关系,因此无需手动创建连接表UserProject
你可以这样做
IdentityModels.cs:
public class ApplicationUser : IdentityUser
public ICollection<Project> Projects get; set;
项目.cs:
public class Project
[...]
public ICollection<ApplicationUser> Users get; set;
就是这样。
手动添加连接表仍然可以,但您必须自己管理 CRUD 操作。 如果您仍想自己添加它,请将 2 个模型保持原样并重新排序连接表中的属性以遵守约定,否则数据库可能会变得混乱,在这种情况下将其编辑为
[Key, Column(Order = 1)]
public string UserId get; set;
public ApplicationUser User get; set;
[Key, Column(Order = 2)]
public int ProjectId get; set;
public Project Project get; set;
要获取用户的项目列表,您可以简单地访问模型中的列表(确保在从数据库中查询用户时包含它)
您的假设是正确的,具体取决于您将采用哪种方法,要么创建一个包含 ID 的新 UserProject
,要么将 Project
添加到 User.Projects
列表。
【讨论】:
非常感谢您的回复!对于您提到的“要获取用户的项目列表,您可以简单地访问模型中的列表(确保从数据库查询用户时包含它)”,我只是有点困惑。我该怎么做?我问是因为据我所知,向用户添加项目的 ICollection(如上所述)仍然不会将项目放入数据库的 AspNetUsers 表中,那么我将如何在控制器中访问此列表?再次感谢!ApplicationUser.Projects
是一个导航属性,框架负责这里的映射。检查Loading Related Entites 以了解有关加载数据的更多信息,这将阐明我所说的“确保包含它”
哦,好吧,这更有意义。非常感谢您的帮助!以上是关于ASP.NET MVC 如何使用 ApplicationUser 和其他域类之间的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章
Asp.Net MVC Ajax轮训解决Session失效时间
ASP.NET MVC中注册Global.asax的Application_Error事件处理全局异常