2014-11-20 2 views
15

내 문제와 관련하여 조금 수색했지만 도움이 될만한 것을 찾을 수 없습니다. 고유 인덱스에 대한 Entity Framework - UPSERT

그래서 내 문제는/dilema는 다음과 같이 유지 : insert into t(a,b,c) values(1,1,1) on duplicate keys update b=values(b),c=values(c); 하고 교체하는 데 사용되는 대체 형식 : 내가 MySQL 데이터베이스가이 형식을 사용하여 동일한 쿼리에 삽입/업데이트에 사용할 수있는 고유 인덱스 시스템을 가지고 있음을 알고 그 색인에 의한 기존 기록.

내가 MSSQL에서 본 유일한 비슷한 물건이 merge하지만 난 정말 모든과 ...

삽입하거나 업데이트 결국 기반으로 고유 인덱스되지 않습니다하는 쿼리를 확인 그것을 좋아하지 않아이다 정직하게

그래서 Entity Framework로 mysql 고유 UPSERT를 에뮬레이션 할 수 있습니까? 이것은 내 주요 문제입니다 ...

엔티티 집합에서 레코드를 가져 오지 않고 가능한 삽입 또는 업데이트를 위해 null인지 아닌지를 확인하지 않고 의미합니다.

알겠습니까? 안 그래요?

[Table("boats")] 
    public class Boat 
    { 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int id { get; set; } 
     [MaxLength(15)] 
     [Index("IX_ProviderBoat",1,IsUnique=true)] 
     public string provider_code { get; set; } 
     public string name { get; set; } 
     [Index("IX_ProviderBoat", 3, IsUnique = true)] 
     [MaxLength(50)] 
     public string model { get; set; } 
     [Index("IX_ProviderBoat", 2, IsUnique = true)] 
     [MaxLength(15)] 
     [Key] 
     public string boat_code { get; set; } 
     public string type { get; set; } 
     public int built { get; set; } 
     public int length { get; set; }    
    } 

그래서 나는 내 IX_ProviderBoat에 따라/삽입을 업데이트 할 : 모든 힌트는 ... 내가 this을보고 있지만, 버전 6으로 표시되지 않습니다

기업의

예를 유용 할 수 있습니다 고유 인덱스는 EF 사용

enter image description here

+1

데이터 모델이 EF에 적합하지 않습니다. '보트 '테이블에 3 개의 고유 한 키와 함께'보트 .id '가 있어야합니까? 'Boat.provider_code'를 기본 키로 사용하지 않으시겠습니까? 또한,'AddOrUpdate()'는 EF6에서 사용할 수 있습니다. – wahwahwah

+0

AddOrUpdate는 EntityFramework6에서 사용할 수 있습니다. http://stackoverflow.com/questions/22287852/entityframework-6-addorupdate-not-working-with-compound-or-composite-primary-key –

+0

@wahwahwah 1) 이드와 같은 다른 오버로드로 확인해야 할 수도 있습니다. 단지 식별자 (기본 키가 아님)입니다. 2) AddOrUpdate는 내 6.0.0.0 EF 버전에서 가시화되지 않습니다. 3) provider_code는 기본 키이며 고유 인덱스 부분 그룹입니다. – HellBaby

답변

15

AddOrUpdate 방법 IDBSet의 부재이며, 인 EF6에서 사용할 수 있습니다.

AddOrUpdate 방법은 원자 작동하지 않습니다 다시 두 번째 스레드 Update 대신 Add ING을 보장하지 않습니다 여러 스레드에서 호출 - 그래서 당신은 중복 레코드가 저장 얻을 수 있습니다.

이 예는 여러분의 기대에 테스트하고 일했다 : 우리가 boat_code을 변경하는 경우

 Boat boat = new Boat // nullable fields omitted for brevity 
     { 
      boat_code = "HelloWorld", 
      id = 1, 
      name = "Fast Boat", 
      built = 1, 
      length = 100 
     }; 

     using (BoatContext context = new BoatContext()) // or whatever your context is 
     { 
      context.Set<Boat>().AddOrUpdate(boat); // <-- IDBSet!!! 
      context.SaveChanges(); 
     } 

AddOrUpdate() 방법은 새 레코드를 추가합니다. boat_code이 'HelloWorld'이면 기존 레코드를 업데이트합니다. 나는 이것이 당신이 찾고있는 것이라고 믿습니다 ...

희망이 도움이됩니다!

+7

그냥 알다시피 ...이 업서 트는 쓰레드 세이프가 아닙니다 ... 전에 다른 프로덕션에서 발견 한 것처럼 ...> _ < – Aron

+0

컨텍스트를 처리하는 방법에 달려 있습니다 ...이 메서드는 스레드 안전성과는 아무런 관련이 없습니다. "할 일이 없다"는 말은, 상용구 EF를 사용하지 않는 한, 코드의 어느 시점에서 GC를 명시 적으로 호출해야한다는 의미입니다. – wahwahwah

+7

두 개의 스레드, 두 개의 컨텍스트, 같은 명령, 같은 시간. 복제 된 삽입물 ... 많은 재미! 나는 EF가 원자 적으로'MERGE'를 사용하기를 희망했다. 그러나 select/insert/update를 사용합니다. – Aron

관련 문제