Insertar listas secundarias en SQL con Dapper

asp.net-core dapper dapper-extensions sql sql-server

Pregunta

Tengo las siguientes 2 tablas:

public class TestA
{
    public int Id { get; set; }
    public string Name { get; set; }

    public IEnumerable<TestB> Test { get; set; }
}

public class TestB
{
    public int Id { get; set; }
    public int TestAId { get; set; }
}

La idea es que puedo acceder a todos los registros TestB relacionados con TestA desde mi objeto TestA. Lo que intento averiguar es cómo puedo insertar tanto en la Prueba A como en la Prueba B, especialmente si TestB tiene varias filas relacionadas con la Prueba A. Esto es lo que probé:

var data = new TestA
{
    Name = "ABC",
    Id = 1,
    Test = new List<TestB>
    {
        new TestB() { Id = 1, TestAId = 1},
        new TestB() {Id = 2, TestAId = 1},
        new TestB() {Id = 3, TestAId = 1}
    }
};

var query = "INSERT INTO TestA(Id, Name) VALUES(@Id, @Name) INSERT INTO TestB(Id, TestAId) VALUES(@Test.TestB.Id, @Test.TestB.TestAId)";

using (var con = conn)
{
    con.Execute(query, data);
}

Sé que podemos darle una lista a apuesto y es lo suficientemente inteligente como para enumerar esa lista e insertar registros individuales, pero ¿cómo puedo lograr lo mismo si esa lista es hija de un objeto? Traté de hacer que mis valores también fueran @Test.Id, @Test.TestAId pero tenía exactamente el mismo error.

El miembro de tipo Test.TestB no se puede usar como valor de parámetro

Respuesta popular

Podrías probar esto:

var data = new TestA
{
    Name = "ABC",
    Id = 1,
    Test = new List<TestB>
    {
        new TestB() { Id = 1, TestAId = 1},
        new TestB() {Id = 2, TestAId = 1},
        new TestB() {Id = 3, TestAId = 1}
    }
};

var query = "INSERT INTO TestA(Id, Name) VALUES(@Id, @Name) INSERT INTO TestB(Id, TestAId) VALUES(@Test.TestB.Id, @Test.TestB.TestAId)";

using (var con = conn)
{
    var query = "INSERT INTO TestA(Id, Name) VALUES(@Id, @Name)";
    con.Execute(query, new { Id = data.Id, Name = data.Name });


    foreach (var item in data.Test)
    {
        string processQuery = "INSERT INTO TestB(Id, TestAId) VALUES (@Id, @TestAId )";        
        connection.Execute(processQuery, item);
    }
}


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué