Sqlite-Extensions 中的多对多关系未正确更新

Many to Many relationship not updating properly in Sqlite-Extensions

我正在 Android 中创建一个聊天应用程序,使用 sqlite 扩展来创建数据库 table 之间的关系。 这是设置舞台的代码墙:

对话Table

public class Conversation
{
    [PrimaryKey, Unique, AutoIncrement]
    public int ID { get; set; }
    public string toUser { get; set; }
    public string FromUser { get; set; }

    [ManyToMany(typeof(ChatConversation), CascadeOperations = CascadeOperation.All)]
    public List<ChatMessage> ChatMessages { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<ConversationDeleted> DeletedConversations { get; set; }
    public DateTime CreatedAt { get; set; }

    public int UserID { get; set; }


}

ChatMessage Table

    public class ChatMessage
{
    [PrimaryKey, Unique, AutoIncrement]
    public int ChatMessageID { get; set; }
    public string fromUser { get; set; }
    public string toUser { get; set; }
    public string Message { get; set; }
    public bool DeliveryStatus { get; set; }
    public DateTime CreatedAt { get; set; }

    [Unique, AutoIncrement, NotNull]
    public Guid UniqueID { get; set; }

    [ManyToMany(typeof(ChatConversation), CascadeOperations = CascadeOperation.All)]
    public List<Conversation> Conversation { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<MessageDeleted> MessagesDeleted { get; set; }
    public int UserId { get; set; }

}

中介 table 聊天和对话 table 关系

    class ChatConversation
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [ForeignKey(typeof(Conversation))]
    public int ConversationID { get; set; }

    [ForeignKey(typeof(ChatMessage))]
    public int ChatID { get; set; }
}

当我向用户发送消息时,它会创建一个与聊天消息对象级联的新对话。当我在同一台设备上登录到其他用户的帐户时,会创建一个新对话,并且将同一条聊天消息级联起来。现在的问题是,用户收到消息后,第一个用户创建的对话与聊天消息之间形成的关系不再存在。 此处用户发送消息:

            string messageText = messageET.Text.ToString();
            if (TextUtils.IsEmpty(messageText))
            {
                return;
            }
            var member = dbr.GetMember(loggeduser);
            var uniqueID = Guid.NewGuid();
            proxySubscriber.InvokeSendMessage(user, messageText, uniqueID);
            ChatMessage chatMessage = new ChatMessage();
            chatMessage.Message = messageText;
            chatMessage.fromUser = loggeduser;
            chatMessage.toUser = user;
            chatMessage.CreatedAt = DateTime.Now;
            chatMessage.UniqueID = uniqueID;
            chatMessage.UserId = member.UserID;
            dbr.insertUpdateChat(chatMessage);
            var duplicat_chat_msg = dbr.GetChat().ToList().Where(u => u.UniqueID == uniqueID).FirstOrDefault();
            List<ChatMessage> msg_list = new List<ChatMessage>();
            msg_list.Add(duplicat_chat_msg);
            var update_conv = dbr.GetConversations().Where(f => f.FromUser == loggeduser && f.toUser == user && f.UserID == member.UserID).FirstOrDefault();
            var deleted_conversation = dbr.GetConversationDeleted().Where(d => d.UserID == member.UserID && d.ConversationID == update_conv.ID).FirstOrDefault();
            bool HasConversation = false;
            if (deleted_conversation != null)
            {
                HasConversation = true;
            }

            if (update_conv != null && !HasConversation)
            {
                update_conv.ChatMessages.Add(duplicat_chat_msg);
                dbr.UpdateConversationData(update_conv);
            }
            else
            {
                Conversation conv = new Conversation { ChatMessages = msg_list, CreatedAt = DateTime.Now, FromUser = loggeduser, toUser = user, UserID = member.UserID };
                dbr.insertConversationData(conv);
            }
            displayMessage(chatMessage);
            messageET.Text = "";
        };

此处用户收到聊天:

var member = dbr.GetMember(loggedonuser);
            chat_msg.DeliveryStatus = true;
            var chat = dbr.GetChat().ToList().Where(c => c.UniqueID == chat_msg.UniqueID).FirstOrDefault();
            if (chat == null)
            {
                dbr.insertUpdateChat(chat_msg);
            }
            var conversation = dbr.GetConversations().Where(f => f.toUser == chat_msg.toUser && f.FromUser == chat.fromUser && f.UserID == member.UserID).FirstOrDefault();
            var deleted_conversation = dbr.GetConversationDeleted().Where(d => d.UserID == member.UserID && d.ConversationID == conversation.ID).FirstOrDefault();
            bool HasConversation = false;
            if (deleted_conversation != null)
            {
                HasConversation = true;

            }


            if (conversation == null && !HasConversation)
            {
                Conversation conv = new Conversation { toUser = chat_msg.toUser, FromUser = chat_msg.fromUser, CreatedAt = DateTime.UtcNow, UserID = member.UserID };
                conv.ChatMessages = new List<ChatMessage> { chat_msg };
                dbr.insertConversationData(conv);

            }
            else
            {
                conversation.ChatMessages.Add(chat_msg);
                dbr.UpdateConversationData(conversation);
            }

当发件人创建对话时,对话与发送的聊天消息之间形成了关系,但是当第二个用户收到消息时,这种关系被打破,并且在接收者创建的对话之间形成了新的关系信息。由于关系是多对多的,这不应该发生。这是将对话插入数据库的位置:

        public string insertConversationData(Conversation data)
    {
        try
        {

            {
                db.InsertOrReplaceWithChildren(data, recursive:true);
            }


            return "Single data file inserted or updated";
        }
        catch (SQLiteException ex)
        {
            Thread.Sleep(500);
            return insertConversationData(data);
        }
    }

谁能看看我的代码并告诉我哪里出了问题?

您必须考虑到调用 UpdateWithChildren 将保存对象的 当前 状态。

所以你现在所做的相当于:

update_conv.ChatMessages.RemoveAll();
update_conv.ChatMessages.Add(message);

因为在您添加新消息时 ChatMessages 是空的。

在更新时,SQLite-Net Extensions 将删除除那个关系之外的所有关系,因为那是新列表的样子。


添加这一行:

update_conv.GetChildren();

这一行之后:

var update_conv = dbr.GetConversations().Where(f => f.FromUser == loggeduser && f.toUser == user && f.UserID == member.UserID).FirstOrDefault();

你的第二段代码也是如此。