如何将 POST/PATCH 发布/修补到 Azure 移动服务上的多对多关系实体



我一直在遵循Windows开发中心的现场工程师示例项目,以指导在我的模型上映射多对多关系。一直困扰我的是如何将条目插入到多对多关系中。

以我的模型为例:

一个组织可以有多个用户

一个用户可以属于多个组织

我的用户模型类如下所示:

public class User
{
    public User()
    {
        this.Organizations = new HashSet<Organization>();
    }
    public int Id { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
    public string PasswordSalt { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Active { get; set; }
    public string Picture { get; set; }
    public string PictureMimeType { get; set; }
    public bool Confirmed { get; set; }
    public string ConfirmationKey { get; set; }
    [JsonIgnore]
    public virtual ICollection<Organization> Organizations { get; set; }
}

我的用户DTO类是这样的:

public class UserDTO : EntityData
{
    public string Email { get; set; }
    public string Password { get; set; }
    public string PasswordSalt { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool Active { get; set; }
    public string Picture { get; set; }
    public string PictureMimeType { get; set; }
    public bool Confirmed { get; set; }
    public string ConfirmationKey { get; set; }
}

我的组织类:

public class Organization
{
    public Organization()
    {
        this.Users = new List<User>();
    }
    public string Id { get; set; }
    public string Title { get; set; }
    public string LegalName { get; set; }
    public string TaxReference { get; set; }
    [JsonIgnore]
    public virtual ICollection<User> Users { get; set; }
}

我的组织DTO类:

public class OrganizationDTO : EntityData
{
    public string Title { get; set; }
    public string LegalName { get; set; }
    public string TaxReference { get; set; }
    public virtual ICollection<UserDTO> Users { get; set; }
}

考虑到这些类,我创建了控制器类,我使用 AutoMapper 映射了 DTO 和模型类,如下所示:

cfg.CreateMap<Organization, OrganizationDTO>()
   .ForMember(organizationDTO => organizationDTO.Id, 
      map => map.MapFrom(organization => MySqlFuncs.LTRIM(MySqlFuncs.StringConvert(organization.Id))))
   .ForMember(organizationDTO => organizationDTO.Users, 
      map => map.MapFrom(organization => organization.Users));
 cfg.CreateMap<OrganizationDTO, Organization>()
    .ForMember(organization => organization.Id, 
       map => map.MapFrom(organizationDTO => MySqlFuncs.LongParse(organizationDTO.Id)))
    .ForMember(organization => organization.Users, 
       map => map.Ignore());
使用

Fluent API,我使用 EntityTypeConfiguration 类定义了这两个实体之间的关系,如下所示:

public class UserEntityConfiguration : EntityTypeConfiguration<User>
{
    public UserEntityConfiguration()
    {
        this.Property(u => u.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        this.HasMany<Organization>(u => u.Organizations).WithMany(o => o.Users).Map(uo =>
        {
            uo.MapLeftKey("UserId");
            uo.MapRightKey("OrganizationId");
            uo.ToTable("OrganizationsUsers");
        });
    }
}
我创建了一个 TableController 类

来增强 UserDTO 和 OrganizationDTO插入新用户或新组织没有问题,但据我所知,每个 TableController 类的端点只允许我单独添加用户组织

要在 OrganizationsUser 表中创建一个条目,我该如何实现此目的?

我认为 PATCH 请求应该是执行此操作的一种方法,但这是正确的方法吗?我必须为此定义一个表控制器吗?如何公开此关系中元素的插入、更新、选择和删除?要发送到端点的 JSON 是什么?

编辑 1

我尝试在这样的组织中修补用户属性:

url: serviceUrl/tables/Organization/1

JSON正文:

{
  "users": [
    {
      "id": "1"
    }
  ]
}

但这给了我一个错误:

其中一个主键值的类型与类型不匹配 在实体中定义。有关详细信息,请参阅内部异常。 参数名称:键值

内部异常:

参数类型"Edm.Int32"和"Edm.String"与 此操作。靠近 WHERE 谓词,第 1 行,第 78 列。

如果我没记错的话,似乎我需要将我发送的字符串映射到使用 Fluent API 创建的连接表中,但是如何映射使用 Fluent API 定义的连接表?PATCH是做到这一点的方法吗?还是有其他办法?

我认为

PATCH应该可以工作,但我不是自动映射器的专家。

如果每个组织中只有几个用户,另一种选择是在后端创建表示联接表的视图。请参阅我在此论坛帖子中的帖子,了解其工作原理的示例:https://social.msdn.microsoft.com/Forums/azure/en-US/4c056373-d5cf-4ca6-9f00-f152d2b01372/best-practice-for-syncing-related-tables-in-offline-mode?forum=azuremobile。这种方法的优点是它确实简化了客户端数据模型,并且它不必知道任何有关外键的信息。

但是,问题是您最终可能会得到重复的用户/组织,这会占用客户端数据库中的更多空间。但是,由于我的示例设置 UpdateAt 和版本的方式,您将获得所有更新,例如,一旦用户的详细信息发生更改。

最新更新