【问题标题】:Many to Many relation for ApplicationUser and Custom model classApplicationUser 和自定义模型类的多对多关系
【发布时间】:2022-01-12 17:18:06
【问题描述】:

我正在尝试实现以下案例场景: 有一个自定义表,假设是 Task,我想与类 Application 用户创建多对多关系。

目前我有以下项目架构:

- Client
- Server
   - ApplicationUser.cs
- Shared
   - Task.cs

这里是类:

共享程序集中的Task.cs:

public class Task
{      
    public Guid Id { get; set; }
    public string Name { get; set; }

    public ICollection<ApplicationUser> ApplicationUsers { get; set; }    
    public List<ApplicationUserTask> ApplicationUserTasks { get; set; }
}

Server 程序集中的ApplicationUser.cs:

public class ApplicationUser : IdentityUser
{
    public Guid Id { get; set; }

    public ICollection<Task> Tasks { get; set; }    
    public List<ApplicationUserTask> ApplicationUserTasks { get; set; }
}

根据Microsoft docs,我需要创建一个新类,名为:

public class ApplicationUserTask
{      
    public int ApplicationUserId { get; set; }
    public ApplicationUser ApplicationUser { get; set; }

    public int TaskId { get; set; }
    public Task Task { get; set; }
}

在客户端和服务器中有共享程序集的引用。然而,由于当前的结构,不可能有这样的关系,我需要将 ApplicationUser.cs 类移动到共享程序集,但后来我与 NuGet 包发生冲突,因为这个 using Microsoft.AspNetCore.Identity;

我该怎么办?

  1. 在共享程序集中创建新类?例如 UserModel.cs 并使用这个进行操作?在这种情况下,数据库中会有新表。我应该不断地将 ApplicationUser 表复制到 UserModel 表吗?
  2. 将Task.cs 移至Server 程序集根据Microsoft 文档执行所有程序,然后将TaskDTO.cs 创建到共享程序集并通过DTO 模型与客户端通信?
  3. 还有其他更好的选择吗?

我正在使用:&lt;PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" /&gt;

【问题讨论】:

  • 你使用什么 EFCore(从链接资源暗示 - 如果不正确,说明正确的 ORM)版本?
  • 在这种情况下,DB 中会有新表 - 典型的 RDBMS 不支持 M:M,因此我们分解为两个 1:M。你是否在 C# 端看到这个取决于 EF 版本和设置
  • 旁注,拥有自己的类 Task 会让您对 Threadng.Task 产生无尽的困惑。想别的名字。
  • @HenkHolterman 这只是一个例子。我真正的班级名称是 Project.cs :)

标签: c# sql asp.net asp.net-core blazor


【解决方案1】:

我该怎么办?

选项 2) 是最好的,恕我直言。

IdentityUser 属于您不想在客户端中引用的封闭库。它还包含许多您不需要或不想在 API 中公开的字段。

您的问题来自于尝试结合 Model 和 DTO 类。这不是最佳做法,尽管我承认它在(非常)小应用程序中可能很有吸引力。

因此,将您的模型保留在服务器项目中,并将定制的 DTO 类放入 Shared 中。现在它只对 User 类至关重要,但是当您的项目发展壮大时,您会很高兴您也为其余部分做到了。

【讨论】:

  • 好吧,所以你说 Shared 应该只有所谓的 DTO 类,而所有实际的模型类都应该在 Server 中?如果是这样,我已经需要重做一些事情了。这是我的第一个 Blazor 应用程序......但是当我想到可以实际使用它的真实案例场景时,它已经开始快速增长
  • 是的。查看 IdentityUser,以及 PasswordHash 和 LockoutStatus 等。您不希望在客户端上使用它。您的任务和其他模型也会如此。
  • 您能否进一步指导我。我应该使用 DTO 还是有其他更好的选择,例如 ViewModel 或其他?我的意思是使用 ViewModel 实现更好吗?
  • 使用 Blazor,您可以将 DTO 用作(被动)视图模型。
猜你喜欢
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 2021-04-19
  • 2014-09-28
  • 2014-02-02
  • 2020-04-25
相关资源
最近更新 更多