2009-03-26 2 views
7

내가 비즈니스 개체 (개발자 쓰기) 및 일부 sprocs가 (DBA의 WRITE)가저장 프로 시저를 사용하는 경우 ORM이 가장 적합한

사람이 이런 종류의 설정을 처리 할 수있는 좋은 개체 매퍼를 추천 할 수 있습니다.

코드 스미스와 nhibernate를 시도하여 문제가 발생했습니다. 내 ORM이 무료 또는 유료인지 상관 없습니다.

+2

나는 sprocs에 대해 그렇게 나빠 보이지 않습니다. 때때로 그들은 단지 일입니다. 그들은 어떻게 나쁜 이름을 얻었습니까? – Cheeso

+0

음, 싫어하는 사람들이 많이 있습니다. 성능에 대한 쿼리를 조정할 때 좋지만 유지 관리를위한 악몽은 내 프로젝트 중 하나처럼 400+ sprocs입니다. VSTS에서 비교할 수있는 스키마에 대해 감사드립니다. – Jojo

+0

새 프로젝트 기술 책임자가 모든 코드 간 데이터베이스 상호 작용을 저장 프로 시저를 통해 수행한다고 주장하기 때문에 유사한 솔루션을 찾고 있습니다.모든 CRUD 작업. 모든 쿼리. 모두. 그러나 그는 완전히 일반적인 DAL을 원합니다 .-) – CMPalmer

답변

7

음속은 sprocs가 우수한 지원을하고있다) 방법을 모르겠어요 그냥, 나는 그 마지막 하나 linq2sql 지원되지 않습니다 말은하지 않습니다 유의하십시오. 각 메소드를 도우미 메소드로 랩핑하고 원하는 경우 강하게 유형화 된 콜렉션이나 엔티티를 결과에서 검색 할 수 있습니다. this blog post에서 그 방법을 보여줍니다. sproc이 SELECT * FROM TableName과 같은 스키마를 반환하는 한, SubSonic 엔티티와 함께 ​​작동합니다.

데이터베이스를 기반으로 클래스를 생성하는 한, 부분 음은 부분 클래스를 생성하므로 필요에 따라 확장 할 수 있습니다. 또한 음속에서 매핑이 실제 모델 클래스를 생성 할 수 있습니다. 그런 다음

class CustomerOrder { 
     private string productName; 

     public string ProductName { 
      get { return productName; } 
      set { productName = value; } 
     } 
     private int total; 

     public int Total { 
      get { return total; } 
      set { total = value; } 
     } 

    } 

:

List<CustomerOrder> orders = Northwind.SPs.CustOrderHist("ALFKI") 
     .ExecuteTypedList<CustomerOrder>(); 

음속은 견고한 "스위스 군용 칼"스타일 ORM이다

+0

- 1 개의 프로 시저에 여러 개의 결과 세트가있는 경우 엔티티에 매핑 될 수 있습니까? :) – eglasius

+0

당신은 단지 그것을 이겼습니다! –

+0

여러 개의 결과 집합을 데이터 집합에만로드 할 수 있다고 생각합니다. –

1

LINQ to SQL 디자이너는 DataContext 개체의 메서드로 형식 안전 sprocs를 제공합니다. CRUD 작업을위한 객체에이를 매우 쉽게 매핑 할 수 있습니다.

사실, 나는 그 일을 정확하게 수행하고 있습니다.

+0

LINQ to SQL과 관련된 문제는 Microsoft가 제품을 상당히 죽인 것입니다. 그리고 Entity 프레임 워크 뒤에 모든 것을 가져야합니다. – Jojo

+0

@Joe 사실은 아니지만 링크가 있지만 거기에 또 다른 대답이 있습니다. linq2sql을 사용하여 진행중인 팀이 있다는 업데이트가 있습니다 – eglasius

+0

링크가 있으면 좋겠지 만 구글 그것을 발견 할 수 있는지, 마지막으로 나는 그것이 막 다른 골목 인 ADO 팀으로 옮겨 졌다고 들었다. – Jojo

2

데이터베이스에 따라 Entity Framework 또는 NHibernate이 가능성이 가장 높습니다 (링크의 예).

+0

아니, Nhibernate는 sprocs와 잘 작동하지 않습니다. 그것은 돌려 보내진 품목이 paticular 순서에 있고 다른 제한이 있어야합니다. linq2sql과 마찬가지로 – Jojo

0

내가보기에 가장 중요한 문제는 SP와 함께하면 ORM을 사용할 때 특히 정보 검색시 자동으로 많은 유연성을 잃어 버리는 것입니다. 이 때문에 대부분의 ORM 기능을 모두 사용할 수 없게됩니다.

예를 들어, linq2sql을 사용하면 SP에 거의 래퍼가 적용됩니다. 또한 생성 된 엔티티의 삽입, 삭제 및 업데이트를 저장 프로 시저에 매핑 할 수 있습니다. 당신이 느슨한 경우 많은 정보의 검색에 모두 쿼리 지금은 고정되어 있기 때문에 (당신은 즉, 필요한 여분의 열보다 더 많은 정보를 검색 할 수 있습니다 - 또는 SP를 많이 생성)과 게으른 로딩에 있습니다.

업데이트 : 나는 linq2sql 녀석이지만, NHibernate에 관한 가정을 다시 살펴볼 것이다. 특히 열 이름이 구성되어 있으므로 열 순서를 강제하지 않을 것으로 의심됩니다 (http://nhibernate.info/blog/2008/11/23/populating-entities-from-stored-procedures-with-nhibernate.html 참조). 그것은 또한 linq2sql : http://nhibernate.info/blog/2008/11/23/populating-entities-with-associations-from-stored-procedures-with-nhibernate.html으로하는 방법을 모르는 뭔가를 지원합니다.

5

음속은 유연한 솔루션을 제공합니다. 당신이 sprocs가 쓰는 DBA를 가지고 있기 때문에

1

, 내가 할 수있는 가장 좋은 방법은 개체에 테이블을 매핑하는 방법, 그리고 수 있도록 데이터베이스를 구성하는 방법을 알아 내기 위해 그와 긴밀하게 협력하는 것입니다 생각이 도메인 모델과 함께 작동합니다. sprocs에는 아무런 문제가 없으며 개발자와 DBA 간의 ​​긴밀한 협력이 필요합니다.

이상적인 DBA는 프로젝트 팀의 일부입니다 ...

0

저는 Entity Framework가 지금 sprocs를 처리하는 방식을 좋아합니다. 엔티티의 진부한 작동에 sprocs를 연결할 수 있으며, 엔티티의 속성과 일치하는 sproc을 탐지 할 수도 있습니다. 하나의 큰 단점은 바로 당신이 엔티티와 하나의 sproc을 연관 시킨다면 모든 crud 연산을 sproc과 연관시켜야한다는 것입니다.

EF Sproc article에는 EF에서 sprocs를 사용하는 방법에 대한 몇 가지 좋은 예가 있으며, 또한 실제로 좋은 확장 방법이 있습니다.

5

면책 조항 : 나는 Dapper의 저자입니다.


당신은 Dapper이 잘 맞는 객체 사업에 매핑 발동을 처리하는 간단한 객체 매퍼를 찾고 있다면.

"그래프 관리", "ID 맵"등이 없다는 점에 유의하십시오. 그것은 베어 본 (bare bone)을 제공합니다. 다른 ORM이없는 많은 시나리오를 다루는 솔루션입니다.

그럼에도 불구하고, 가장 빠른 오브젝트 구체화 장치 중 하나를 제공합니다. 이는 benchmarks에서 아음속보다 EF보다 10 배 빠르거나 아음속보다 100 배 빠릅니다.


사소한 :

create proc spGetOrder 
    @Id int 
as 
select * from Orders where Id = @Id 
select * from OrderItems where OrderId = @Id 

로 매핑 할 수 다음을 수행 할 수 있습니다

  1. 멀티 - 매퍼 :

    var grid = cnn.QueryMultiple("spGetOrder", new {Id = 1}, commandType: CommandType.StoredProcedure); 
    var order = grid.Read<Order>(); 
    order.Items = grid.Read<OrderItems>(); 
    

    는 또한 당신에 대한 지원을 단일 행에서 여러 객체로

  2. 입력/출력/반품 PARAM 지원
  3. 그래서 예를 들면

(TVPs 등) 처리 dB 특정 매개 변수에 대한

  • 확장 가능한 인터페이스 :

    var p = new DynamicParameters(); 
    p.Add("Id", 1); 
    p.Add("Message",direction: ParameterDirection.Output); 
    p.Add("rval",direction: ParameterDirection.ReturnValue); 
    var grid = cnn.QueryMultiple("spGetOrder", p, commandType: CommandType.StoredProcedure); 
    var order = grid.Read<Order,User,Order>((o,u) => {o.Owner = u; return o;}); 
    order.Items = grid.Read<OrderItems>(); 
    
    var returnVal = p.Get<int>("rval"); 
    var message = p.Get<string>("message"); 
    
    :

    create proc spGetOrderFancy 
        @Id int, 
        @Message nvarchar(100) output 
    as 
    set @Message = N'My message' 
    select * from Orders join Users u on OwnerId = u.Id where Id = @Id 
    select * from OrderItems where OrderId = @Id 
    return @@rowcount 
    

    로 매핑 할 수 있습니다


    마지막으로,

    public interface IDynamicParameters 
    { 
        void AddParameters(IDbCommand command); 
    } 
    

    이 인터페이스를 구현할 때 명령에 추가 할 매개 변수를 dapper에게 알릴 수 있습니다. 이를 통해 테이블 ​​반환 형 매개 변수 및 기타 DB 관련 기능을 지원할 수 있습니다.

  • 관련 문제