【问题标题】:Adding a list parameter to an ASP.NET Core model向 ASP.NET Core 模型添加列表参数
【发布时间】:2021-04-11 17:56:04
【问题描述】:

我正在尝试将字符串 cmets 列表添加到我的数据模型中。经过一番谷歌搜索,这是我想出的:

public class TaskItem
{
  public long Id { get; set; };
  public string title { get; set; };
  public List<Comment> comments { get; set; }
}

public class Comment
{
  public long Id { get; set; }
  public string comment_text { get; set; }
}

使用 Postman 发送 POST 会得到很好的 201 响应:

{
  "id": 1,
  "title": "First task",
  "comments": [
     {
       "id": 1,
       "comment_text": "This is one comment"
     },
     {
       "id": 2,
       "comment_text": "Here is another"
     }
   ]
}

但是:使用 GET 请求检索项目会在 cmets 字段中产生“null”(响应代码为 200):

{
  "id": 1,
  "title": "First task",
  "comments": null   <--------- ???
}

为什么 API 不返回 POST 后的 cmets?

提前致谢/大卫

编辑:根据请求,这是我的控制器的相关部分(使用 Visual Studio 自动生成):

 // GET: api/TaskItems/5
 [HttpGet("{id}")]
 public async Task<ActionResult<TaskItem>> GetTaskItem(long id)
 {
     var taskItem = await _context.TaskItems.FindAsync(id);

     if (taskItem == null)
     {
         return NotFound();
     }

     return taskItem
}

// POST: api/TaskItems
[HttpPost]
public async Task<ActionResult<TaskItem>> PostTaskItem(TaskItem taskItem)
{
    _context.TaskItems.Add(taskItem);
    await _context.SaveChangesAsync();

    return CreatedAtAction(nameof(GetTaskItem), new { id = taskItem.Id }, taskItem);
}

【问题讨论】:

  • 如果没有 minimal reproducible example 来阐明您的具体问题或没有其他详细信息来突出确切所做的事情,那么将很难重现问题这将有助于更好地理解什么是实际问题。
  • 为什么在 POST 工作时使用 GET? Get 和 Post 都返回响应。唯一的区别是 Post 请求正文中有数据,而 Get 请求正文为空。
  • 你能展示一下你的控制器吗?
  • @DavidMontgomery 很可能 cmets 未保存在 POST 上,因此在发出后续 GET 请求时未检索到。
  • 问题不只是延迟加载吗?因为您在 _context.TaskItems?docs.microsoft.com/en-us/ef/core/querying/related-data 之后缺少包含。某处应该有明显的欺骗

标签: c# asp.net .net entity-framework


【解决方案1】:

我认为 Comment 类应该有 TaskItemId 外键。如果没有此外键,您将无法在保存 cmets 后取回它们:

public class Comment
{
  public long Id { get; set; }

  public long TaskItemId { get; set; }

 [ForeignKey("TaskItemId")]
 public TaskItem TaskItem { get; set; }
  public string comment_text { get; set; }
}

【讨论】:

  • @Serget 感谢您的回答。我试过但无法让它工作。请参阅上面的答案,了解我可以完成这项工作的解决方案
【解决方案2】:

所以在@Drag and Drop 的帮助下,我设法解决了这个问题——我不得不使用延迟加载。首先我安装了延迟加载代理:

dotnet add package Microsoft.EntityFrameworkCore.Proxies

然后我将模型更新为:

public class TaskItem
{
    public long Id { get; set; }
    public string title { get; set; }
    public virtual List<Comment> comments { get; set; } // <-- This had to be virtual
}

public class Comment
{
    public long Id { get; set; }
    public string comment_text { get; set; }
}

我也不得不改变我的环境:

public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<TaskContext>(opt =>
    opt.UseLazyLoadingProxies() // <-- This I had to add
        .UseInMemoryDatabase("TaskData"));

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多