2010-07-06 7 views
6

SQL Server 2008의 엔트 ASP.NET MVC 2.0 Linq에 - 투 - SQL 특정 플레이어 (툰)는 특정 몬스터를 제압했을 때 추적는 LINQ to SQL은을 사용하여 MERGE 마십시오

나는 게임 사이트를 구축하고, (보스). 테이블은 다음과 같습니다.

나는 최신 정보 (툰, 보스, 시간)를 돌려주는 3D 파티 서비스를 사용합니다.
이제 데이터베이스를 새 정보로 업데이트하려고합니다.
무차별 공격 방식은 라인 단위로 업 샘플링하는 것입니다. 하지만보기 흉하게 보입니다 (코드별로). 아마 너무 느릴 수도 있습니다.

나는 더 좋은 해결책은 임시 테이블을 사용하여 새로운 데이터를 삽입하고 머지 (MERGE) 문을 실행하는 것이라고 생각한다.

좋은 생각인가요? 나는 임시 테이블이 "피하는 것이 더 좋다"는 것을 압니다. 이 작업을 위해 영구적 인 임시 테이블을 만들어야합니까?
아니면 현재 전체 집합 (최대 100 줄)을 읽고 병합하고 응용 프로그램 내에서 다시 붙여야합니까?

언제나 조언/제안은 언제나 감사하겠습니다.

답변

6

ORM은 배치 작업을 수행하기위한 잘못된 도구이며 Linq-to-SQL도 예외는 아닙니다. 이 경우 올바른 해결책을 선택했다고 생각합니다. 모든 항목을 임시 테이블에 빠르게 저장 한 다음 병합을 사용하여 UPSERT를 수행하십시오.

데이터를 임시 테이블에 저장하는 가장 빠른 방법은 SqlBulkCopy을 사용하여 원하는 테이블에 모든 데이터를 저장하는 것입니다.

-1

직선형 인서트처럼 보입니다.

private ToonModel _db = new ToonModel(); 
Toon t = new Toon(); 
t.ToonId = 1; 
t.BossId = 2; 
t.LastKillTime = DateTime.Now(); 
_db.Toons.InsertOnSubmit(t); 
_db.SubmitChanges(); 
+2

이미 ID = 1 인 Toon을 가지고 있다면 "중복 ID"를주지 않습니까? –

6

당신이 Linq에 - 투 - SQL을 사용하는 경우는, upserts 그 추한되지 않습니다 ..

foreach (var line in linesFromService) { 
    var kill = db.Kills.FirstOrDefault(t=>t.ToonId==line.ToonId && t.BossId==line.BossId); 
    if (kill == null) { 
     kill = new Kills() { ToonId = line.ToonId, BossId = line.BossId }; 
     db.Kills.InsertOnSubmit(kill); 
    } 
    kill.LastKillTime = line.LastKillTime; 
} 
db.SubmitChanges(); 

하지 예술 작품,하지만 SQL보다 좋네요. 또한 100 행만 있으면 성능에 너무 신경 쓰지 않을 것입니다.

+0

성능이 문제가되지 않으므로 LINQ 방식을 추한 SQL보다 사용하십시오. –

0

레코드를 먼저 쿼리하지 않고 업데이트하려면 다음을 수행 할 수 있습니다. 아직 기록이 존재하는지 확인하기 위해 한 번 DB를 공격하지만 기록 끌어되지 않습니다

var blob = new Blob { Id = "some id", Value = "some value" }; // Id is primary key (PK) 

if (dbContext.Blobs.Contains(blob)) // if blob exists by PK then update 
{ 
    // This will update all columns that are not set in 'original' object. For 
    // this to work, Blob has to have UpdateCheck=Never for all properties except 
    // for primary keys. This will update the record without querying it first. 
    dbContext.Blobs.Attach(blob, original: new Blob { Id = blob.Id }); 
} 
else // insert 
{ 
    dbContext.Blobs.InsertOnSubmit(blob); 
} 
dbContext.Blobs.SubmitChanges(); 

이에 대한 확장 방법에 대한 here를 참조하십시오.