2010-04-12 2 views
0

LINQ to SQL은 데이터베이스 트랜잭션의 모든 변경 사항을 자동으로 래핑한다는 것을 알고 있습니다. 그래서 다른 삽입 (내 사용자 테이블에 AddressID가 있으므로 새 주소 레코드를 추가 한 다음 해당 ID를 사용하여 새 사용자 레코드를 추가 함)에 대해 반환 된 ID를 사용하려는 경우 사용자 삽입 문제가 발생했습니다. 주소 삽입 되돌아 가지 않을거야. 두 SubmitChanges를 다른 트랜잭션으로 래핑해야합니까?ASP MVC LINQ to SQLtransaction 롤백

답변

0

테이블에 외래 키 관계가있는 경우 LINQ to SQL에서이 문제를 처리합니다.

당신이 관련 테이블 당신의 디자이너 상

먼저 드래그 아래의 단계를 수행 할 수 비주얼 스튜디오 DBML 디자이너를 사용하려면

과 일대 realtionship는 UserAddress의 컬렉션 속성의 추가에 의해 설립됩니다 User 클래스.

이, SQL에 LINQ는 다음 트랜잭션의 일부로서 필요한 기본 키의 검색 및 삽입을 처리하면 사용자 개체를 UserAddress 객체를 생성하고 사용자 객체에 추가 한 후 저장할 수

User user = new User(); 
user.FirstName = "Foo"; 
user.LastName = "Bar"; 

UserAddress userAddress = new UserAddress(); 
userAddress.Line1 = "22"; 
userAddress.Line2 = "Acacia Ave"; 
userAddress.Postcode = "E13 9AZ"; 

user.UserAddresses.Add(userAddress); 
db.Users.InsertOnSubmit(user); 
db.SubmitChanges(); 

변경 제출 중에 작성된 요약 된 버전에서 테이블에 대한 두 가지 업데이트가 모두 하나의 트랜잭션에 포함되어 있으므로 실행 중에 오류가 발생하면 롤백됩니다 (프로필러를 실행할 수 있음). 귀하의 DB를 깊이 SQL을 실행 볼 수).

BEGIN TRANSACTION 
INSERT INTO [dbo].[UserAddresses]([UserID], [Line1], [Line2], [Postcode]) VALUES (@p0, @p1, @p2, @p3) 
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value] 
exec sp_executesql N'INSERT INTO [dbo].[UserAddresses]([UserID], [Line1], [Line2], [Postcode]) VALUES (@p0, @p1, @p2, @p3) 
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]',N'@p0 int,@p1 nchar(10),@p2 nchar(10),@p3 nchar(10)',@p0=3,@p1=N'22  ',@p2=N'Acacia Ave',@p3=N'E13 9AZ ' 
INSERT INTO [dbo].[Users]([FirstName], [LastName]) VALUES (@p0, @p1) 
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value] 
exec sp_executesql N'INSERT INTO [dbo].[Users]([FirstName], [LastName]) VALUES (@p0, @p1) 
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]',N'@p0 nchar(10),@p1 nchar(10)', @p0=N'Foo  ',@p1=N'Bar  
COMMIT TRANSACTION 
+0

Dude. 그게 최고야. 나는이 ORM 물건을 사랑한다! 정말 고마워. –