마이크로 ORM으로 작업 할 때 가장 좋은 전략은 무엇입니까?

c# dapper massive orm petapoco

문제

나는 PetaPOCO와 Dapper를 사용하기 시작했으며 둘 다 자신의 한계가 있습니다. 그러나 반대로, Entity Framework보다 너무 빠르므로 그 한계를 놓아 버리는 경향이 있습니다.

내 질문은 : 우리가 일대 다, 다 대일 및 다 대 다 관계를 구체적으로 정의 할 수있는 ORM이 있습니까? Dapper.Net과 PetaPOCO는 이러한 관계를 가짜로 만드는 일종의 해킹 방법을 구현하며, 5-6 개의 조인이있을 때도 잘 확장되지 않습니다. 우리가 처리 할 수있는 하나의 마이크로 ORM이 없다면 두 번째 질문은 이러한 마이크로 ORM이 관계를 정의하는 데 좋지 않고 모든 단일 유형에 대해 새로운 POCO 엔티티를 작성한다는 사실을 놓아야합니다. 이러한 유형의 다중 조인을 포함하는 쿼리를 실행하고 있습니까? 이것이 잘 확장 될 수 있습니까?

내 질문에 내가 분명하기를 바랍니다. 그렇지 않다면 알려주세요.

수락 된 답변

나는 일반적으로이 단계들을 따른다.

  1. 내가보기에 표시하려는 정확한 데이터와 형식을 나타내는 방식으로 내 viewmodel을 만듭니다.
  2. 내 뷰 모델에 PetaPoco를 통해 데이터베이스에서 직접 쿼리합니다.

내 지부에는

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

메서드는 기존 객체를 사용하고 이름이 일치하는 열을 직접 매핑 할 수 있습니다. 이 시나리오에서는 훌륭하게 작동합니다.

필요한 경우 내 지점을 여기에서 찾을 수 있습니다. https://github.com/schotime/petapoco/


인기 답변

5 ~ 6 개의 조인이있을 때조차도 잘 확장되지 않습니다.

네, 그렇습니다. 그러나 좋은 것은 아닙니다. 시스템을 구축 할 때 복잡한 작업이 시작될 때 성능상의 제약이나 두통없이 원하는 조인을 자유롭게 할 수 있기 때문입니다.

네, Linq2SQL을 사용하여이 모든 JOINS를 작성할 필요가 없을 때 그리워졌습니다. 그렇지만 일반적인 조인을 작성하는 간단한 도구를 작성하여 모든 엔티티의 기본 SQL을 얻은 다음 거기에서 빌드 할 수 있습니다.

예:

[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;
    }



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.