내가 비즈니스 개체 (개발자 쓰기) 및 일부 sprocs가 (DBA의 WRITE)가저장 프로 시저를 사용하는 경우 ORM이 가장 적합한
사람이 이런 종류의 설정을 처리 할 수있는 좋은 개체 매퍼를 추천 할 수 있습니다.
코드 스미스와 nhibernate를 시도하여 문제가 발생했습니다. 내 ORM이 무료 또는 유료인지 상관 없습니다.
내가 비즈니스 개체 (개발자 쓰기) 및 일부 sprocs가 (DBA의 WRITE)가저장 프로 시저를 사용하는 경우 ORM이 가장 적합한
사람이 이런 종류의 설정을 처리 할 수있는 좋은 개체 매퍼를 추천 할 수 있습니다.
코드 스미스와 nhibernate를 시도하여 문제가 발생했습니다. 내 ORM이 무료 또는 유료인지 상관 없습니다.
음속은 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이다
- 1 개의 프로 시저에 여러 개의 결과 세트가있는 경우 엔티티에 매핑 될 수 있습니까? :) – eglasius
당신은 단지 그것을 이겼습니다! –
여러 개의 결과 집합을 데이터 집합에만로드 할 수 있다고 생각합니다. –
LINQ to SQL 디자이너는 DataContext 개체의 메서드로 형식 안전 sprocs를 제공합니다. CRUD 작업을위한 객체에이를 매우 쉽게 매핑 할 수 있습니다.
사실, 나는 그 일을 정확하게 수행하고 있습니다.
데이터베이스에 따라 Entity Framework 또는 NHibernate이 가능성이 가장 높습니다 (링크의 예).
아니, Nhibernate는 sprocs와 잘 작동하지 않습니다. 그것은 돌려 보내진 품목이 paticular 순서에 있고 다른 제한이 있어야합니다. linq2sql과 마찬가지로 – Jojo
내가보기에 가장 중요한 문제는 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으로하는 방법을 모르는 뭔가를 지원합니다.
음속은 유연한 솔루션을 제공합니다. 당신이 sprocs가 쓰는 DBA를 가지고 있기 때문에
, 내가 할 수있는 가장 좋은 방법은 개체에 테이블을 매핑하는 방법, 그리고 수 있도록 데이터베이스를 구성하는 방법을 알아 내기 위해 그와 긴밀하게 협력하는 것입니다 생각이 도메인 모델과 함께 작동합니다. sprocs에는 아무런 문제가 없으며 개발자와 DBA 간의 긴밀한 협력이 필요합니다.
이상적인 DBA는 프로젝트 팀의 일부입니다 ...
저는 Entity Framework가 지금 sprocs를 처리하는 방식을 좋아합니다. 엔티티의 진부한 작동에 sprocs를 연결할 수 있으며, 엔티티의 속성과 일치하는 sproc을 탐지 할 수도 있습니다. 하나의 큰 단점은 바로 당신이 엔티티와 하나의 sproc을 연관 시킨다면 모든 crud 연산을 sproc과 연관시켜야한다는 것입니다.
이 EF Sproc article에는 EF에서 sprocs를 사용하는 방법에 대한 몇 가지 좋은 예가 있으며, 또한 실제로 좋은 확장 방법이 있습니다.
면책 조항 : 나는 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
로 매핑 할 수 다음을 수행 할 수 있습니다
var grid = cnn.QueryMultiple("spGetOrder", new {Id = 1}, commandType: CommandType.StoredProcedure);
var order = grid.Read<Order>();
order.Items = grid.Read<OrderItems>();
는 또한 당신에 대한 지원을 단일 행에서 여러 객체로
(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 관련 기능을 지원할 수 있습니다.
나는 sprocs에 대해 그렇게 나빠 보이지 않습니다. 때때로 그들은 단지 일입니다. 그들은 어떻게 나쁜 이름을 얻었습니까? – Cheeso
음, 싫어하는 사람들이 많이 있습니다. 성능에 대한 쿼리를 조정할 때 좋지만 유지 관리를위한 악몽은 내 프로젝트 중 하나처럼 400+ sprocs입니다. VSTS에서 비교할 수있는 스키마에 대해 감사드립니다. – Jojo
새 프로젝트 기술 책임자가 모든 코드 간 데이터베이스 상호 작용을 저장 프로 시저를 통해 수행한다고 주장하기 때문에 유사한 솔루션을 찾고 있습니다.모든 CRUD 작업. 모든 쿼리. 모두. 그러나 그는 완전히 일반적인 DAL을 원합니다 .-) – CMPalmer