ASP.NET 核心 API 无法从多对多关系中的模型获取数组
ASP.NET Core API unable to get array from from model in a many-to-many relationship
我创建了一个 post api 但我无法从我的 api 中的数组中检索数据。
模特
public class Video
{
public int Id { get; set; }
public string Nom { get; set; }
[NotMapped]
public IFormFile image { get; set; }
public String imageURL { get; set; }
public ICollection<Langue> Langues { get; set; }
}
public class VideoLangue
{
public int Id { get; set; }
public video video { get; set; }
public int LangueId { get; set; }
public Langue Langue { get; set; }
}
public class Langue
{
public int LangueId { get; set; }
public string Designation { get; set; }
[JsonIgnore]
public ICollection<Video> Videos { get; set; }
}
并在 OnMODelCreating
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Langue>()
.HasMany(e => e.Videos)
.WithMany(e => e.Langues)
.UsingEntity<ViodeLangue>(
bg => bg
.HasOne(bg => bg.Video)
.WithMany()
.HasForeignKey("Id"),
bg => bg
.HasOne(bg => bg.Langue)
.WithMany()
.HasForeignKey("LangueId"))
.ToTable("VideoLangue")
.HasKey(bg => new { bg.Id, bg.LangueId });
我的控制器是这样的
public async Task<ActionResult<Cours>> PostCours([FromForm] Video video)
{
当我请求 api 并查看视频 ID 和 nom 的值时,没有问题,但 langues 为空(count= 0 且没有原始数据。
通过swagger请求或postman给出保存结果(见swagger接口)
swagger 生成的请求
curl -X 'POST' \
'https://localhost:44349/api/Cours' \
-H 'accept: text/plain' \
-H 'Content-Type: multipart/form-data' \
-F 'Nom=la bonne video' \
-F 'Langues={
"langueId": 1,
"designation": "Français"
}' \
-F 'Langues={
"langueId": 3,
"designation": "chinois"
}' \
-F 'Id=5'
在visual Studio中结果是
你有解决办法吗?
您将表单数据与 JSON 混合在一起。它要么都必须在 JSON 中(我会这样做),要么都必须在表单数据中。要将值数组添加为表单数据,您必须为数组中的每个元素使用方括号中的索引(例如 [0]
)。
我认为这可能有效(未经测试):
curl -X 'POST' \
'https://localhost:44349/api/Cours' \
-H 'accept: text/plain' \
-H 'Content-Type: multipart/form-data' \
-F 'Nom=la bonne video' \
-F 'Langues[0].LangueId=1' \
-F 'Langues[0].designation=Français' \
-F 'Langues[1].LangueId=3' \
-F 'Langues[1].designation=chinois' \
-F 'Id=5'
我创建了一个 post api 但我无法从我的 api 中的数组中检索数据。
模特
public class Video
{
public int Id { get; set; }
public string Nom { get; set; }
[NotMapped]
public IFormFile image { get; set; }
public String imageURL { get; set; }
public ICollection<Langue> Langues { get; set; }
}
public class VideoLangue
{
public int Id { get; set; }
public video video { get; set; }
public int LangueId { get; set; }
public Langue Langue { get; set; }
}
public class Langue
{
public int LangueId { get; set; }
public string Designation { get; set; }
[JsonIgnore]
public ICollection<Video> Videos { get; set; }
}
并在 OnMODelCreating
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Langue>()
.HasMany(e => e.Videos)
.WithMany(e => e.Langues)
.UsingEntity<ViodeLangue>(
bg => bg
.HasOne(bg => bg.Video)
.WithMany()
.HasForeignKey("Id"),
bg => bg
.HasOne(bg => bg.Langue)
.WithMany()
.HasForeignKey("LangueId"))
.ToTable("VideoLangue")
.HasKey(bg => new { bg.Id, bg.LangueId });
我的控制器是这样的
public async Task<ActionResult<Cours>> PostCours([FromForm] Video video)
{
当我请求 api 并查看视频 ID 和 nom 的值时,没有问题,但 langues 为空(count= 0 且没有原始数据。
通过swagger请求或postman给出保存结果(见swagger接口)
swagger 生成的请求
curl -X 'POST' \
'https://localhost:44349/api/Cours' \
-H 'accept: text/plain' \
-H 'Content-Type: multipart/form-data' \
-F 'Nom=la bonne video' \
-F 'Langues={
"langueId": 1,
"designation": "Français"
}' \
-F 'Langues={
"langueId": 3,
"designation": "chinois"
}' \
-F 'Id=5'
在visual Studio中结果是
你有解决办法吗?
您将表单数据与 JSON 混合在一起。它要么都必须在 JSON 中(我会这样做),要么都必须在表单数据中。要将值数组添加为表单数据,您必须为数组中的每个元素使用方括号中的索引(例如 [0]
)。
我认为这可能有效(未经测试):
curl -X 'POST' \
'https://localhost:44349/api/Cours' \
-H 'accept: text/plain' \
-H 'Content-Type: multipart/form-data' \
-F 'Nom=la bonne video' \
-F 'Langues[0].LangueId=1' \
-F 'Langues[0].designation=Français' \
-F 'Langues[1].LangueId=3' \
-F 'Langues[1].designation=chinois' \
-F 'Id=5'