简体   繁体   English

插入包含文本块的对象子列表时出现问题

[英]Having problem inserting child list of objects with included textblobs

I'm hoping someone can shed some light on this problem.我希望有人可以对这个问题有所了解。 Being new to the extensions, it is probably something I'm doing wrong.作为扩展的新手,这可能是我做错了。 I have an object called Reason:我有一个名为原因的 object:

    public class Reason
    {
        [PrimaryKey, AutoIncrement]
        public int id { get; set; }
        public string Description { get; set; }
        [OneToMany]
        public List<MiniGroup> Groups {get;set; }
    }

Then the MiniGroup object looks like this:然后 MiniGroup object 看起来像这样:

    public class MiniGroup
    {
        [AutoIncrement, PrimaryKey]
        public int id { get; set; }
        public string TeamNumber { get; set; }
        [TextBlob("guidBlog")]
        public List<string> StudentGuids { get; set; }
        [TextBlob("nameBlob")]
        public List<string> StudentNames { get; set; }
        public string guidBlob { get; set; }
        public string nameBlob { get; set; }
        [ForeignKey(typeof(Reason))]
        public int ReasonID { get; set; }
    }

I create the two tables without difficulty.我毫不费力地创建了这两个表。 The problem is inserting data.问题是插入数据。 I tried我试过了

        public async Task AddNewReasonsAsync(List<Reason> reasons)
        {
            foreach (Reason reason in reasons)
            {
                try
                {
                    await conn.InsertWithChildrenAsync(reason);
                    await conn.InsertAllWithChildrenAsync(reason.Groups, true);

                    StatusMessage = string.Format("Added [Name: {0})", reason.Groups.Count);
                }
                catch (Exception ex)
                {
                    // now, try to update
                    try
                    {
                        await conn.UpdateWithChildrenAsync(reason.Groups);
                        await conn.UpdateWithChildrenAsync(reason);
                    }
                    catch (Exception)
                    {

                        StatusMessage = string.Format("Failed to add {0}. Error: {1}", reason.Groups.Count, ex.Message);
                    }
                    StatusMessage = string.Format("Failed to add {0}. Error: {1}", reason.Groups.Count, ex.Message);
                }

            }

        }

This code results in System.NullReferenceException: Object reference not set to an instance of object with the below stack trace.此代码导致 System.NullReferenceException: Object reference not set to an instance of object with the following stack trace. I've checked the object, the only null values are the blob targets.我检查了 object,唯一的 null 值是 blob 目标。 My understanding those get populated during the Insert.我的理解是在插入期间填充这些内容。

  at SQLiteNetExtensions.Extensions.TextBlob.TextBlobOperations.UpdateTextBlobProperty (System.Object element, System.Reflection.PropertyInfo relationshipProperty) [0x00041] in C:\projects\sqlite-net-extensions\SQLiteNetExtensions\Extensions\TextBlob\TextBlobOperations.cs:54 
  at SQLiteNetExtensions.Extensions.WriteOperations.RefreshForeignKeys (System.Object element) [0x000b8] in C:\projects\sqlite-net-extensions\SQLiteNetExtensions\Extensions\WriteOperations.cs:368 
  at SQLiteNetExtensions.Extensions.WriteOperations.UpdateWithChildren (SQLite.SQLiteConnection conn, System.Object element) [0x00000] in C:\projects\sqlite-net-extensions\SQLiteNetExtensions\Extensions\WriteOperations.cs:39 
  at SQLiteNetExtensions.Extensions.WriteOperations.InsertAllWithChildrenRecursive (SQLite.SQLiteConnection conn, System.Collections.IEnumerable elements, System.Boolean replace, System.Boolean recursive, System.Collections.Generic.ISet`1[T] objectCache) [0x0006d] in C:\projects\sqlite-net-extensions\SQLiteNetExtensions\Extensions\WriteOperations.cs:169 
  at SQLiteNetExtensions.Extensions.WriteOperations.InsertAllWithChildren (SQLite.SQLiteConnection conn, System.Collections.IEnumerable elements, System.Boolean recursive) [0x00000] in C:\projects\sqlite-net-extensions\SQLiteNetExtensions\Extensions\WriteOperations.cs:91 
  at SQLiteNetExtensionsAsync.Extensions.WriteOperations+<>c__DisplayClass3_0.<InsertAllWithChildrenAsync>b__0 () [0x00013] in C:\projects\sqlite-net-extensions\SQLiteNetExtensionsAsync\Extensions\WriteOperations.cs:103 
  at System.Threading.Tasks.Task.InnerInvoke () [0x0000f] in /Users/builder/jenkins/workspace/archive-mono/2019-10/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2476 
  at System.Threading.Tasks.Task.Execute () [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2019-10/android/release/external/corert/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs:2319 
--- End of stack trace from previous location where exception was thrown ---

  at StudentGroupsMobile.Data.ReasonDBManager.AddNewReasonsAsync (System.Collections.Generic.List`1[T] reasons) [0x00216] in C:\Users\toman\source\repos\StudentGroupsMobile_XF\StudentGroupsMobile\Data\ReasonDBManager.cs:37 

I have even tried looping through the MiniGroup list and inserting each individually, that results in the same error.我什至尝试遍历 MiniGroup 列表并单独插入每个列表,这会导致相同的错误。

Anyone see what I'm doing wrong?有人看到我做错了吗? Any help is greatly appreciated!任何帮助是极大的赞赏!

So I solved the problem by simplifying the set up.所以我通过简化设置解决了这个问题。 Instead of having a OneToMany relationship from reason to groups, I made the groups into a TextBlob.我没有将原因与组建立 OneToMany 关系,而是将组变成了一个 TextBlob。 Here are the working objects:以下是工作对象:

    public class Reason
    {
        [PrimaryKey, AutoIncrement]
        public int id { get; set; }
        public string Description { get; set; }
        [TextBlob("GroupsBlob")]
        public List<MiniGroup> Groups {get;set; }
        public string GroupsBlob { get; set; }
    }

    public class MiniGroup
    {
        [AutoIncrement, PrimaryKey]
        public int id { get; set; }
        public string TeamNumber { get; set; }
        [TextBlob("guidBlog")]
        public List<string> StudentGuids { get; set; } //= new List<string>();
        [TextBlob("nameBlob")]
        public List<string> StudentNames { get; set; } //= new List<string>();
        public string guidBlob { get; set; }
        public string nameBlob { get; set; }
        //[ForeignKey(typeof(Reason))]
        //public int ReasonID { get; set; }
    }

Then the processing becomes much simpler:那么处理就变得简单多了:

        public async Task AddNewReasonsAsync(List<Reason> reasons)
        {


            try
            {
                await conn.InsertAllWithChildrenAsync(reasons);
            }
            catch (Exception)
            {
                await conn.UpdateWithChildrenAsync(reasons);
            }


        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM