Search code examples
c#api.net-corelitedb

LiteDB use same ID for different entries


I have a database where I'm trying to add messages and I use channelID for LiteDB id. I want to post more than 1 message in the same channel somehow but for that I would have to use the same ID somehow.

   private LiteDatabase Database { get; } = new LiteDatabase(@"data/msg.db");

    public ILiteCollection<Message> Messages { get { return Database.GetCollection<Message>("Messages"); } }

    public void Add(int channelid, Message message)
    {
        message.ChannelID = channelid;
        Messages.Insert(message);

        //Books.Add(book.Id,book);
    }

Message class

public class Message
{
    [LiteDB.BsonId]
    public int ChannelID { get; set; }

    public int User { get; set; }

    public DateTime Date { get; set; }

    public string Text { get; set; }
}

This is the API I want to replicate: http://www.webservies.be/chat/swagger/index.html In this it's possible to use the same channelID when I want to POST a message.


Solution

  • If you want your class to match the API you posted, you'll need an additional Channel class with a one-to-many relationship with Message. One chat channel can have many messages, right?

    Something like

    public class Channel
    {
        [BsonId]
        public int ChannelId { get; set; }
        public string Name { get; set; }
    
        [BsonRef]
        public List<Message> Messages { get; set; }
    }
    
    public class Message
    {
        [BsonId]
        public int MessageId { get; set; }
        public int ChannelId { get; set; }
        public int UserId { get; set; }
        public DateTime Date { get; set; }
        public string Text { get; set; }
    }
    

    Inserting a new message would be very similar to what you've already done.

    public void Add(int channelId, string text, int userId)
    {
       var message = new Message {
           ChannelId = channelId,
           Text = text,
           UserId = userId,
           Date = DateTime.Now
       };
    
       Messages.Insert(message);
    }