Las mejores estrategias cuando se trabaja con micro ORM?

c# dapper massive orm petapoco

Pregunta

Empecé a usar PetaPOCO y Dapper y ambos tienen sus propias limitaciones. Pero, por el contrario, son tan rápidos como el Entity Framework que tiendo a soltar las limitaciones.

Mi pregunta es: ¿hay algún ORM que nos permita definir relaciones uno a muchos, muchos a uno y muchos a muchos en concreto? Tanto Dapper.Net como PetaPOCO implementan una especie de truco para falsificar estas relaciones y, además, ni siquiera escalan muy bien cuando puede tener 5-6 combinaciones. Si no hay un único ORM micro que nos permita lidiar con él, entonces mi segunda pregunta es si debo dejar de lado el hecho de que estos micro ORM no son tan buenos para definir relaciones y crear una nueva entidad POCO para cada tipo individual. de consulta que estaría ejecutando que incluye estos tipos de combinaciones múltiples ¿Puede esta escala bien?

Espero ser claro con mi pregunta. Si no, házmelo saber.

Respuesta aceptada

Generalmente sigo estos pasos.

  1. Creo mi modelo de vista de tal manera que represente los datos exactos y el formato que quiero mostrar en una vista.
  2. Realizo consultas directamente desde la base de datos a través de PetaPoco a mis modelos de vista.

En mi rama tengo un

T SingleInto<T>(T instance, string sql, params object[] args);

método que toma un objeto existente y puede asignar columnas directamente a él con el mismo nombre. Esto funciona brillantemente para este escenario.

Mi sucursal se puede encontrar aquí si es necesario. https://github.com/schotime/petapoco/


Respuesta popular

ni siquiera se escalan muy bien cuando puedes tener 5-6 combinaciones

Sí, no es así, pero eso es bueno, porque cuando el sistema que va a construir se vuelva complejo, puede hacer las uniones que desee, sin penalizaciones ni dolores de ejecución.

Sí, echo de menos cuando no necesitaba escribir todo esto UNE con Linq2SQL, pero luego creé una herramienta simple para escribir las combinaciones comunes, así obtengo el SQL básico para cualquier entidad y luego puedo construir desde allí.

Ejemplo:

[TableName("Product")]
[PrimaryKey("ProductID")]
[ExplicitColumns]
public class Product {
    [PetaPoco.Column("ProductID")]
    public int ProductID { get; set; }

    [PetaPoco.Column("Name")]
    [Display(Name = "Name")]
    [Required]
    [StringLength(50)]
    public String Name { get; set; }

            ...
            ...

    [PetaPoco.Column("ProductTypeID")]
    [Display(Name = "ProductType")]
    public int ProductTypeID { get; set; }

    [ResultColumn]
    public string ProductType { get; set; }

            ...
            ...


    public static Product SingleOrDefault(int id) {
        var sql = BaseQuery();
        sql.Append("WHERE Product.ProductID = @0", id);
        return DbHelper.CurrentDb().SingleOrDefault<Product>(sql);
    }
    public static PetaPoco.Sql BaseQuery(int TopN = 0) {
        var sql = PetaPoco.Sql.Builder;
        sql.AppendSelectTop(TopN);
        sql.Append("Product.*, ProductType.Name as ProductType");
        sql.Append("FROM Product");
        sql.Append("    INNER JOIN ProductType ON Product.ProductoTypeID = ProductType.ProductTypeID");
        return sql;
    }


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow