我正在尝试实现以下案例场景:有一个自定义表,比方说Task,我想创建与类Applicationuser的多对多关系。
目前我有以下项目arcitechture:
- 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; }
}
服务器程序集中的ApplicationUser.cs:
public class ApplicationUser : IdentityUser
{
public Guid Id { get; set; }
public ICollection<Task> Tasks { get; set; }
public List<ApplicationUserTask> ApplicationUserTasks { get; set; }
}
根据微软的文档,我需要创建一个新的类,名为:
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;
我该怎么办?
- 在共享程序集中创建新类?例如UserModel.cs,并使用此操作?在这种情况下,DB中会有新的表。那么我应该不断地将ApplicationUser表复制到UserModel表吗
- 将Task.cs移动到服务器程序集根据Microsoft文档执行所有过程,然后将TaskDTO.cs创建到共享程序集并通过DTO模型与客户端通信
- 还有其他更好的选择吗
我正在使用:<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0" />
我该怎么办?
选项2(是最好的,imho。
IdentityUser属于一个封闭库,您不想在客户端中引用该库。它还包含许多您不需要或不想在API中公开的字段。
您的问题来自于尝试将Model和DTO类组合在一起。这不是最好的做法,尽管我承认它在一个(非常(小的应用程序中可能很有吸引力。
因此,将模型保留在服务器项目中,并将定制的DTO类放在Shared中。现在,它只对User类是必不可少的,但当你的项目增长时,你会很高兴你也为剩下的部分做了。