Insertar el objeto que se debe mapear en diferentes tablas DB según el escenario

c# dapper dapper-contrib sql-server

Pregunta

Tengo un objeto con nombres de propiedades que nombran exactamente los nombres de campo dentro de la tabla DB, pero no estoy seguro de cómo insertarlo. Lo único diferente es el nombre de la tabla DB. Entonces, es un objeto con un nombre de tabla de modelo / mapa diferente, pero quiero que se inserte en una tabla con un nombre diferente al modelo. Intenté esto:

var val = info.FooBarObj;
conn.Execute("insert DBInformation(val) values(@val)", new { val = val }); 

Donde eg

El objeto es FooBarObj y las propiedades son int Id, string Foo, string Bar

y DBInformation tiene los nombres de los campos: Id, Foo, and Bar pero la tabla no se llama FooBarObj , se llama DBInformation .

¿Cómo puedo insertar algo como esto? Estoy usando Dapper

EDITAR:

¿Puedo tener dos atributos de tabla para el modelo FooBar?

Ejemplo [Table("DBInformation")] y [Table("FooBar")] .

Tengo un caso de borde extraño donde quiero insertar en FooBar si ocurre este escenario, si ocurre otro escenario, inserte en DBInformation. Ese es el problema que estoy enfrentando actualmente y por eso no puedo simplemente agregar el atributo y terminar con este problema.

Respuesta aceptada

Mira el proyecto Dapper.Contrib . Le permite decorar sus clases modelo con algunos atributos útiles.

Use el atributo Table en su clase FooBar para identificar que esto debe asignarse a la tabla DBInformation . Por ejemplo:

[Table("DBInformation")]
public class FooBar
{
    #region Properties

    [ExplicitKey] // Use this attribute if your ID field is not automatically generated, (identity)
    public int Id { get; set; }
    public string Foo { get; set; }
    public string Bar { get; set; }
    ...
}

Y otra ventaja de usar Dapper.Contrib es que le permitirá realizar operaciones CRUD muy fácilmente. Por ejemplo, para insertar:

using (var conn = new SqlConnection(connectionString))
{
     conn.Insert(myFooBar);
}

y para la actualización:

using (var conn = new SqlConnection(connectionString))
{
     conn.Update<FooBar>(myFooBar);
}

etc.

EDITAR

Para abordar cuál es su problema "real", (su última edición desde el original), donde necesita insertar potencialmente en dos tablas, dependiendo de un escenario en particular, entonces volvería simplemente a ajustar su SQL que proporciona apuesto:

string theTable = someCondition : "DBInformation" : "FooBar"; 
using (var conn = new SqlConnection(connectionString))
{
    conn.Insert(myFooBar);
    string insertSql = $"INSERT INTO {theTable} ([Id], [Foo], [Bar]) VALUES @FooBarObj.Id, @...)";            
    var result = conn .Execute(insertSql , myFooBar);
}

Respuesta popular

Creo que flyte tiene una buena parte de la respuesta y su solución ciertamente podría funcionar, y el proyecto Dapper.Contrib es muy útil.

Solo para dar otra solución o al menos una forma ligeramente diferente de mirarlo. En primer lugar, creo que todas las entidades solo deberían representar una tabla, mantendrá las cosas claras en el futuro en el caso de que las dos tablas diverjan.

Entonces, lo que podría intentar hacer es tener dos clases donde el duplicado amplíe el original (o sea una copia). Luego use un mapeador (elija cualquiera) cuando necesite insertar la entrada duplicada.

[Table("Original")]
public class Original
{
    //properties
}

[Table("Duplicate")]
public class Duplicate : Original
{
    //properties
}

Entonces cuando tu condición se cumple.

if (something)
{
    var dup = _mapper.Map<Original, Duplicate>(orig);
    conn.Insert(dup);
}

Espero que esto ayude.



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é