【问题标题】:How to add to an object to a list inside a database via API post method如何通过 API post 方法将对象添加到数据库内的列表中
【发布时间】:2020-09-11 11:14:54
【问题描述】:

所以我这里有 2 节课:

public class User
{
    [Key]
    public int UserId { get; set; }

    public string Username { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public ICollection<Message> Messages { get; set; }

}

public class Message
{
    [Key]
    public int MessageId { get; set; }

    public string MessageContent { get; set; }

    public DateTime DateCreated { get; set; }

    public int SenderId { get; set; }

    public int ReceiverId { get; set; }
}

我正在尝试通过以下控制器操作创建一条消息,该操作创建一条新消息并将其添加到数据库中,然后更新数据库中的 ICollectionMessages。

这里是控制器:

    [Route("sendMessage")]
    [HttpPost]
    public async Task SendMessage([FromBody] Message message)
    {
        var newMessage = new Message
        {
            MessageContent = message.MessageContent,
            DateCreated = DateTime.Now,
            SenderId = message.SenderId,
            ReceiverId = message.ReceiverId

        };

        _dbContext.Messages.Add(newMessage);

        var user = _dbContext.Users.SingleOrDefault(x => x.UserId == message.SenderId);

        if(user != null)
        {
            var userMessages = user.Messages.ToList();
            userMessages.Add(newMessage);
        }


        await _dbContext.SaveChangesAsync();

    }

但是我得到一个“对象引用未设置为对象的实例。”错误,我相信这是因为 'var userMessages = user.Messages.ToList();'为 NULL,因此无法向空列表添加值。

有一个巨大的脑雾,有人可以提出解决这个问题的方法吗?

编辑:

我的目标是更新 USERID:

【问题讨论】:

  • 您需要为用户_dbContext.Users.Include(u =&gt; u.Messages).SingleOrDefault(x =&gt; x.UserId == message.SenderId);显式加载消息
  • 我认为你在messages集合的副本中添加了一条消息(因为ToList),所以尝试做user.Messages.Add(newMessage)
  • 太棒了!非常感谢您的出色工作!

标签: c# asp.net linq entity-framework-core asp.net-core-webapi


【解决方案1】:

尝试这样做

//your code...
var userMessages = user.Messages;
userMessages.Add(newMessage);
//your code...

【讨论】:

  • 我没有收到错误消息和消息,但它不会更新数据库中的用户 ID。 UserId 仍为 NULL
【解决方案2】:

变化:

public class User
{
    [Key]
    public int UserId { get; set; }

    public string Username { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public ICollection<Message> Messages { get; set; } = new Collection<Message>();

}

所以收藏总是存在的,

   ...
   var user = _dbContext.Users.Include(u=>u.Messages).SingleOrDefault(x => x.UserId == message.SenderId);

   if(user != null)
   {
      var userMessages = user.Messages;
      userMessages.Add(newMessage);
   }

   await _dbContext.SaveChangesAsync();

查找用户时包含消息,添加新用户时直接使用集合。

【讨论】:

  • 嘿,感谢您的输入,但这似乎不起作用。用户 ID 不更新。请查看我的编辑以获取有关我要实现的目标的更多详细信息
  • userId 取决于您在 ModelBuilder/DbContext 上设置身份的方式。使用您的 DbContext 更新您的问题。
【解决方案3】:

我认为您将消息添加到消息集合的副本中(因为 ToList),所以尝试执行 user.Messages.Add(newMessage)

user.Messages.Add(newMessage)

由 E. Shcherbo 修复

谢谢!

【讨论】:

    【解决方案4】:

    您将新消息添加到消息集合的副本中

    var userMessages = user.Messages.ToList()
    

    上面的语句为数据创建了一个全新的列表,所以我称之为

     user.Messages.Add(newMessage);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 2021-12-13
      • 2013-05-17
      相关资源
      最近更新 更多