2013-07-24 2 views
10

저는 현재 기존 데이터와 새로운 데이터가있는 모델을 가지고 있습니다.기존 데이터와 새 데이터가있는 모델을 저장하는 방법은 무엇입니까?

는 예를 들어 이것은 내가 이미이 ..이는 현재

List<NameDetails> Names = new List<NameDetails>{ 

       new NameDetails{Id = 1, Name = "Name 1"}, 
       new NameDetails{Id = 2 , Name = "Name 2"}, 
      }; 
이제

나는 데이터베이스에이를 저장해야 가정이 가지고있는 모의 데이터 것입니다 내 모델

public class NameDetails 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 

    } 

입니다 id = 1이 테이블에 있으므로 업데이트가되어야합니다. id = 2가 추가되어야합니다. 어떻게 할 수 있습니까? 내가 작성한 이전

내가 추가 또는 은과 같이 추가 편집 중 하나를했다 저장소, 그래서 같은

context.NameDetails.Add(NameDetails); 
    context.SaveChanges(); 

또는 편집,

var recordToUpdate = context.NameDetails.FirstOrDefault(x => x.Id== 1); 
recordToUpdate.Name = "New name"; 
context.SaveChanges(); 

은 그래서 무슨 뜻를 사용하여 저장 나는 나의 목록을 통해 반복해야하고 새로운 것과 작동하지 않는 것을 해결해야한다. 그렇지 않으면 또 다른 방법이 있는가?

+1

다음 두 가지 옵션 만 사용할 수 있습니다. - 데이터베이스에 쿼리하여 개체가 이미 있는지 확인합니다. 또는 - 객체가 새로운 것인지 확인하기 위해 객체를 보유하게하십시오 (예 : Id = 0) – Reda

+2

정말로 관련성이 있는지는 모르겠지만 새 레코드에 대해 Id 값 2는 어디에서 얻습니까? –

+0

@ user2266486 또는 업서 트를 수행하는 저장 프로 시저를 만들지 만이 질문/문제가 더 이상 없는지 궁금합니다. –

답변

0

이 시도 :

var nameIds = Names.Select(n => n.Id); 

var recordsToUpdate = context.NameDetails.Where(x => nameIds.Contains(x.Id)); 
0

엔티티 프레임 워크는 상황이 종류에 아주 잘 수행하지 않습니다. 이 당신을 위해 무엇을 찾고있는 당신이 가까이한다 : 또는

public class NameDetails 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 
} 

List<NameDetails> Names = new List<NameDetails> 
    { 
     new NameDetails{Id = 1, Name = "Name 1"}, 
     new NameDetails{Id = 2 , Name = "Name 2"}, 
    }; 


var toFetch = Names.Select(n => n.Id).ToArray(); 
var association = context.NameDetails 
         .Where(n => toFetch.Contains(n.Id)) 
         .ToDictionary(n => n.Id); 

foreach(var name in Names) 
{ 
    NameDetails existing; 
    if(association.TryGetValue(name.Id, out existing)) 
    { 
     // It exists, map the properties in name to existing 
    } 
    else 
    { 
     // It's new, perform some logic and add it to the context 
     context.NameDetails.Add(name); 
    } 
} 

context.SaveChanges() 

, 당신은 납치 시도 할 수 엔티티 프레임 워크 upsert 수행 마이그레이션의 AddOrUpdate :

// You need a namespace import of System.Data.Entity.Migrations 
context.NameDetails.AddOrUpdate(names.ToArray()); 
context.SaveChanges(); 

나는이 시도하지 않은,하지만 AddOrUpdate에 추가 논리가 없으면 작동하지 않을 것입니다.

+0

AddOrUpdate 구현을 간략하게 살펴 보았습니다. 약간의 마인드 벤딩 (mind-bending)은 마술적인 upsert SQL을 만드는 것처럼 보이지 않습니다. 나는 당신이 전달한 엔티티를 얻으려고 쿼리를 작성하고 그 엔티티를 찾거나 엔티티가 없다면 엔티티를 업데이트한다고 확신한다. DB를 시드 할 때 좋으며 모든 것이 이미 메모리에 있습니다. DB에 TOP (1) 쿼리를 예기치 않게 발행 할 때 좋지 않을 수 있습니다. –

2

Entity Framework에서 잘 작동하는 일부 규칙을 사용할 수 있습니다. 당신이 당신의 데이터베이스에 IDENTITY(1,1)를 사용하는 경우 예를 들어

, 엔터티 속성이 Identity (모델 첫 번째 방법의 경우)로 StoreGeneratedPattern 세트를 사용한다 (그래서 자동으로 삽입 된 행에 대한 ID를 생성) 및 0Id 부동산 값은 이며 데이터베이스에 아직 추가되지 않았습니다..

그러면 무엇을 추가하고 무엇을 업데이트할지 쉽게 결정할 수 있습니다. 여기에 몇 가지 의사 (테스트되지 않은) 코드입니다 :

foreach (var entity in entities) 
{ 
    if (entity.Id == 0) 
    { 
     // Adds to the context for a DB insert 
     context.Entities.Add(entity); 
    } 
    else 
    { 
     // Updates existing entity (property by property in this example, you could update 
     // all properties in a single shot if you want) 
     var dbEntity = context.Entities.Single(z => z.Id == entity.Id); 
     dbEntity.Prop1 = entity.Prop1; 
     // etc... 
    } 
} 

context.SaveChanges(); 
1

EF5 + 전용 :

당신은 감지 할 수있는 방법이 있으면 여부 항목 새 (ID == 0이 ken2k의 대답처럼, 좋은입니다) 당신은 일을지도 할 필요 방지하기 위해이 작업을 수행 할 수 있습니다

foreach(var entity in entities) 
{ 
    context.NameDetails.Attach(entity); 
    context.Entry(entity).State = IsNewEntity(entity) 
            ? EntityState.Added 
            : EntityState.Modified; 
} 

이 이전 기관에 대한 새로운 엔티티 및 업데이트 인서트 만들 EntityFramework을 말할 것이다.

관련 문제