ASP.NET MVC如何在ApplicationUser和其他域类之间使用多对多关系

问题描述

我目前正在使用使用Entity Framework和代码优先方法的ASP.NET MVC进行项目。前任,我对所有这些都还很陌生,所以有些事情对我来说仍然没有太多意义。

我在ApplicationUser类和Project类之间建立了多对多关系,

IdentityModels.cs:

public class ApplicationUser : IdentityUser
{
    public ICollection<UserProject> UserProjects { get; set; }
}

Project.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; }
}

我创建了UserProject的DbSet到ApplicationDbContext并为此进行了迁移。

话虽如此,我的问题是我将如何使用这种关系?更具体地说,如果我只想显示登录用户所分配的项目,那我该怎么做呢?

此外,我目前的假设是,如果我想为用户分配项目,则最终只需要使用给定的用户ID和要为其分配项目的ID创建一个新的UserProject对象。那会如何运作?

我对这种关系的配置是否设置正确,还是应该考虑更改它以获得上述功能

任何帮助都将受到赞赏。谢谢!

解决方法

从最后一个问题开始,关于配置

EF6支持多对多关系,因此无需手动创建联接表UserProject 您可以简单地做到这一点

IdentityModels.cs:

public class ApplicationUser : IdentityUser
{
    public ICollection<Project> Projects { get; set; }
}

Project.cs:

public class Project
{
    [...]
    public ICollection<ApplicationUser> Users { get; set; }
}

就是这样。

仍然可以手动添加联接表,但是您将必须自己管理CRUD操作。 如果您仍然想自己添加它,请保留两个模型不变,然后对联接表中的属性进行重新排序以遵守约定,否则数据库可能会变得混乱,在这种情况下,请将其编辑为

{
    [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