我一直在关注Windows 开发中心的现场工程师示例项目,以指导在我的模型上映射多对多关系。困扰我的是如何将条目插入到多对多关系中。
以我的模型为例:
一个组织可以有很多用户。
一个用户可以属于许多组织。
我的User模型类如下所示:
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; }
}
我的UserDTO类是这样的:
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 和 Model 类,如下所示:
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请求应该是一种方法,但它是正确的方法吗?我必须为此定义一个 TableController 吗?如何公开此关系中元素的插入、更新、选择和删除?要发送到端点的 JSON 是什么?
编辑 1
我试图在这样的组织中修补用户属性:
网址:serviceUrl/tables/Organization/1
JSON 正文:
{
"users": [
{
"id": "1"
}
]
}
但这给了我一个错误:
主键值之一的类型与实体中定义的类型不匹配。有关详细信息,请参阅内部异常。参数名称:keyValues
内部异常:
参数类型 'Edm.Int32' 和 'Edm.String' 与此操作不兼容。在 WHERE 谓词附近,第 1 行,第 78 列。
如果我没记错的话,似乎我需要将要发送的字符串映射到使用 Fluent API 创建的连接表中,但是如何映射使用 Fluent API 定义的连接表?PATCH 是这样做的方法吗?还是有其他方法?