2012-09-06 4 views
2

태그 데이터베이스에 삽입해야하는 태그가 있습니다. 태그 데이터베이스에는 기본 키인 '태그'열 하나만 있습니다. 이것은 삽입하는 동안 중복을 방지하는 트릭입니다.삽입시 중복을 방지합니다.

이제 코드와 문제.

foreach (string tagval in tagarray) 
{ 
    try 
    { 
     var tag = new Tag 
     { 
      Tag1 = tagval 
     }; 
     db.AddToTags(tag); 
    } 
    catch 
    { 
    } 
} 
db.SaveChanges(); 

이 방법의 문제는 중복이 조기 발견되면 SaveChanges()를 호출 한 후, 프로그램이 다른 태그를 저장하지 않고 존재입니다. 테이블에 추가 할 때마다 SaveChanges()에 전화하면 프로그램이 비효율적으로되고 많은 전화가 걸릴 것입니다. 이전 삽입이 실패한 후에도 삽입을 계속하는 방법은 무엇입니까?

다른 해결책도 환영합니다.

답변

1

Entity Framework 및 ObjectContext 파생물을 사용하면 이와 같은 작업을 수행 할 수 있습니다.

foreach (var newTag in tagarray.Select(t => 
       new Tag { Tag1 = t }).Except(db.Tags)) 
{ 
    db.Tags.AddObject(newTag); 
} 

try 
{ 
    db.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 
} 
catch (OptimisitcConcurrencyException) 
{ 
    db.Refresh(RefreshMode.StoreWins, db.Tags); 
    foreach (var newTag in tagarray.Select(t => 
        new Tag { Tag1 = t }).Except(db.Tags)) 
    { 
     db.Tags.AddObject(newTag); 
    } 
    db.SaveChanges(); 
} 
+0

그 분명히 데이터 컨텍스트의 사용이 혼란의 원인이되는, SQL에 LINQ 없습니다. 그 엔티티 프레임 워크. –

+0

나는 혼란이 linq-to-sql 태그에 의해 합성되었음을 알았지 만, 이제는 entity-framework 태그로 대체되었다. – Jodrell

1

여기에서 변경해야 할 몇 가지. 먼저, 목록에서 .Distinct을 호출하여 데이터베이스 근처로 이동하기 전에 자신의 목록에서 복제본을 제거하는 것이 가장 좋습니다.

또한 여기에 시도해 볼 필요가 없습니다. 삽입하기 전에 이미 데이터베이스에있는 항목을 확인해야합니다. 이 시도 :

List<string> uniqueItems = tagarray 
    .Distinct() 
    .Where(x => !db.Tags.Contains(x)) 
    .ToList(); 

foreach (string uniqueItem in uniqueItems) 
{ 
    var tag = new Tag 
    { 
     Tag1 = tagval 
    }; 
    db.AddToTags(tag); 
} 

db.SaveChanges(); 
+0

태그 데이터베이스는 많은 항목을 가지고 며칠 만에 도달 할 가능성이 높습니다. 비효율적인지 확인하지 않습니까? –

+0

내 기억이 정확하고 EF가 NHibernate와 같은 방식으로 작동한다면 JOIN을 수행해야하므로 하나의 쿼리 여야합니다. 출력 창에서 확인해보십시오. – mattytommo

0
foreach (string tagval in tagarray) 
{ 
    try 
    { 
     var tag = new Tag 
     { 
      Tag1 = tagval 
     }; 
     if(Tags.Where(e =>tag) != null) 
     { 
     dataContext.AddToTags(tag); 
     } 
    } 
    catch 
    { 
    } 
} 
dataContext.SaveChanges(); 
+0

추가 된 코드의 작동 방식을 설명 할 수 있습니까? –

+0

Tags.Where (e => tag)는 동일한 값을 가진 가능한 모든 태그가있을 경우 태그에 존재합니다. 발생하지 않으면 dataContext.AddToTags (tag); 값 중복 방지 –

+0

효율성은 어떻습니까? 데이터베이스에 튜플이 많이있는 경우 비효율적이지 않습니까? –