이있는 테이블에서 DataAdapter.Update/Refresh 후에 DataTable ID 열이 설정되지 않습니다. 단원 테스트에서 데이터베이스 resp를 준비하기 위해 일반 ADO.NET (DataTable, DataAdapter)을 사용합니다. 테스트 된 컴포넌트 자체는 NHibernate 2.1에서 실행된다. .NET 버전은 3.5이며 SqlServer 버전은 2005입니다."대신"-trigger (SqlServer 2005)
데이터베이스 테이블에는 ID 열이 기본 키로 있습니다. 일부 테이블은 삽입/업데이트 트리거 대신 적용됩니다 (이전 버전과의 호환성 때문에 변경할 수 없음). 트리거는 일반적으로 다음과 같이 작동 :
는create trigger dbo.emp_insert
on dbo.emp
instead of insert
as
begin
set nocount on
insert into emp ...
select @@identity
end
(온 - 더 - 플라이 얇은 ADO.NET 래퍼에 의해 생성)을 ADO.NET 데이터 어댑터가 발행 삽입 문은의 DataRow에 다시 ID 값을 검색하려고 : 아이디 - 열은 데이터베이스에서 설정 한 ID 값을 유지 - 나는 일시적으로 트리거를 제거하면
exec sp_executesql N'
insert into emp (...) values (...);
select id, ... from emp where id = @@identity
'
는 그러나 DataRow를의 ID 열이 잘 작동, 여전히 0입니다.
이 작동exec sp_executesql N'
insert into emp (...) values (...);
select scope_identity()
'
의 NHibernate에 POCO가 제대로 잘 세척 한 후 설정된 ID 속성이 있습니다 반면에
NHibernate에 인서트 문이 종류를 사용합니다. 트리거가 다른 범위에서 실행될 것으로 예상했기 때문에, @@ identity가 scope_identity()보다 더 적합해야합니다.
그래서 아무 문제도 생각하지 않고 ADO.NET에서도 @@ identity 대신 scope_identity()를 적용 할 것입니다. 그러나 이것은 아무 효과가 없으며 DataRow 값은 그에 따라 업데이트되지 않습니다.
이제 가장 중요한 부분은 : SqlServer 프로파일 러에서이 두 문을 복사하여 ("exec sp_executesql"을 포함하는) Management Studio 쿼리에 붙여 넣으면 결과가 반전 된 것처럼 보입니다! ADO.NET 버전이 작동하고, NHibernate 버전은 (scope_identity()를 선택하면 null을 반환하지 않습니다). 나는 검증하기 위해 여러 번 시도했지만, 아무 소용이 없었다. 글쎄, 사실 그것은 내가 기대했던 것인데, @@ 신원 확인이 가능하고 scope_identity()가 실패합니다.
물론 Management Studio에서 호출하면 NHibernate에서 발생하는 모든 결과와 데이터베이스에서 오는 결과 집합이 표시됩니다. ADO.NET은 또 다른 주제입니다. 또한 T-SQL SET에 정의 된 여러 세션 속성은 두 시나리오에서 다릅니다 (Management Studio 쿼리와 런타임의 응용 프로그램)
이것은 나에게 진정한 퍼즐입니다. 나는 그것에 대한 통찰력에 대해 행복 할 것이다. 고맙습니다!