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事件处理全局异常

ASP.NET中的MVC如何使用?

ASP.NET中的MVC如何使用?

ASP.Net 5 MVC 6,如何使用共享 Error.cshtml 作为默认错误响应

如何使用 ASP.Net MVC 路由来路由图像?