【问题标题】:Dapper many to many insert小巧玲珑的多对多插入
【发布时间】:2021-09-26 07:32:27
【问题描述】:

下面是我要插入 SQL 的文件,我已经加载到一个 c# 对象 (MyObject) 中,我正在使用 Dapper,C#。 我的主表是 Person ,子表 Test 和 Staging 表包含 ID,PersonID,TestID 复合键

问题1:我不清楚如何将标签插入到 Person 中,因为标签是 Person 对象中的一个列表。

问题2:如何修复以下代码,因为我不清楚如何在 for each 循环中循环遍历实体 Test。我引用了Dapper many-to-many insert

{
    "_id": "1",
      "name": "Leiz Gab",
    "tags": [
      "tagA",
      "tagB",
      "tagC"
    ],
    "tests": [
      {
        "id": 0,
        "name": "A bsd"
      },
      {
        "id": 1,
        "name": "S Bsd"
      }
    ]
  }

我的代码:

class Program
    {
        static void Main(string[] args)
        {
            var cs = @"Server=DESKTOP-FSNG2D1;Database=msdb;Trusted_Connection=True;";
            using var con = new SqlConnection(cs);
            con.Open();

            List<MyObject> processList = new List<MyObject>();
            MyObject obj = new MyObject();           

            obj.A = "AB";
            obj.B = "CD";

            Test tst = new Test();
            tst.Firstname = "A";
            tst.Surname = "Avd";
            Test tst1 = new Test();
            tst1.Firstname = "B";
            tst1.Surname = "Brgu";

            obj.D.Add(tst);
            obj.D.Add(tst1);

            string pINSERT = "INSERT INTO [msdb].[dbo].[AzureBlob] VALUES(@A, @B, @C,@D)";

            string tINSERT = "INSERT INTO [msdb].[dbo].[Test] VALUES(@Surname, @Firstname)";

            string aINSERT = "INSERT INTO [msdb].[dbo].[Staging] (PersonID, TestID) VALUES(@PersonID, @TestID)";

            var res = con.ExecuteScalarAsync(pINSERT);

            foreach (var a in obj.D)
            {
                var testID = con.ExecuteScalarAsync<int>(tINSERT, a);

                var arows =  con.ExecuteAsync(aINSERT, new { PersonID = res, TestID = testID });
            }

        }
    }

    public class MyObject
    {
        public string A { get; set; }
        public string B { get; set; }
        public List<string> C { get; set; }
        public List<Test> D new List<Test>();

    }

    public class Test
    {
        public int ID { get; set; }

        public string Surname { get; set; }
        public string Firstname { get; set; }

    }

    public class Staging
    {
        public int ID { get; set; }
        public int PersonID { get; set; }
        public int TestID { get; set; }

    }

【问题讨论】:

  • obj.D 是您的测试列表,对吗?那么foreach(var t in obj.D)?
  • 谢谢,尝试过,但出现以下错误,它不允许我添加到以下位置的列表中:Test tst = new Test(); tst.Firstname = "A"; tst.Surname = "Avd"; Test tst1 = new Test(); tst1.Firstname = "B"; tst1.Surname = "Brgu"; obj.D.Add(tst); obj.D.Add(tst1); System.NullReferenceException: '对象引用未设置为对象的实例。 ' InsertRow.MyObject.D.get 返回 null。
  • 我不明白你在说什么。您似乎已将问题中已经存在的代码粘贴到评论中,但没有解释任何内容。 编辑问题,这样代码就是你现在的样子,并指示哪一行给出了错误
  • @CaiusJard 当然,我已经用你的初始建议修改了代码foreach (var a in obj.D) 并尝试运行它,我得到空的 ReferenceException,它基本上不允许我将项目添加到列表中,你能请建议如何进一步进行。谢谢
  • 我的朋友你的 D 列表当前未初始化。

标签: c# sql-server dapper


【解决方案1】:

在您的 MyObject 中,将列表属性设置为如下。您需要在使用它之前初始化您的列表。 公共列表 D { 获取;放; } = 新列表();

【讨论】:

  • 谢谢@maxspan,但是 Dapper,上面的代码没有在 sql 表中插入任何记录,我肯定遗漏了一些东西。
【解决方案2】:

如果您进行第二次查询:

INSERT INTO [msdb].[dbo].[Test] VALUES(@Surname, @Firstname);
SELECT SCOPE_IDENTITY()

这应该意味着您的代码将收到生成的 id,并从那里开始工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2019-11-10
    • 2011-10-15
    • 2012-04-08
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多