2013-12-15 5 views
0

저는 EF 및 WebAPI를 사용하고 많은 하위 속성 (예 : 도시, 국가 등)을 가진 새 객체를 저장하려고합니다. 이러한 속성에 대한 데이터는 외부 소스에서 가져 왔지만보고 목적으로 개체와 함께 내 데이터베이스에 저장하려고합니다. 이런 이유로 새로운 부모와 함께 전달되는 새로운 자식이 이미 존재하는지 확인해야합니다 (데이터베이스에서 가져 오지 않았 음을 기억하십시오).엔티티 프레임 워크 - 하위 엔티티 저장

예를 들어 내가 저장 한 도시를 선택한 경우 전달 된 객체에 내 도시 ID가 없어서 EF에서 새 항목이라고 생각하여 중복 행을 저장합니다.

DB에 이미있는 경우 연결을 시도했지만 첨부 할 수 없습니다. 아이템이 컨텍스트에 의해 이미 추적되고 있다고합니다.

다음은 새 부모를 저장하기 전에 하위 컬렉션 중 하나를 확인하고 저장하는 코드입니다.

foreach (HBCountry country in hbcampaign.HBTargetingSpec.HBCountries) 
{ 
    if (db.HBCountries.Any(c => c.country_code == country.country_code)) 
    { 
     country.CountryID = db.HBCountries.Where(c => c.country_code == country.country_code) 
              .FirstOrDefault() 
              .CountryID; 
     db.HBCountries.Attach(country); 
    } 
    else 
    { 
     db.HBCountries.Add(country); 
    }     
} 

나는 나의 상황에서 기존 엔티티의 ID를 잡기 위해 필요하지만 그 후 나는 첨부 EF이 항목에 대한 새 항목을 만들 필요가 없다는 것을 알려 수 없습니다.

저는 EF에 처음 접했고 아이 콜렉션을 가진 엔티티를 저장/업데이트하는 데 어려움을 겪고 있습니다. 상황이 문맥에 붙어있을 때와 그렇지 않을 때 내 마음을 감싸는 것처럼 보일 수 없습니다.

+0

을 코딩 할 것입니다. 부모를 가져 와서 하위 엔티티를 추가하려면 parent.Childern.Add() 또는 parent.ChildernId = id를 사용하십시오. 여기 Lazy Loading을 사용하지 않기를 바랍니다. –

+0

'Count()> 0'보다'Any() '를 사용하는 것이 더 좋습니다. 'Count()'루프가 전체 콜렉션을 통해 반복되고, 조건없이 첫 번째 항목에서'Any()'가 보입니다. –

+0

감사. Any()를 사용하도록 코드를 업데이트했습니다. 나는 아직도 찔 렸어. 내 자신의 데이터 소스에서 자식 속성을 당기는 경우 큰 문제가 아니지만 기본적으로 매번 "새"항목을 보내고 있기 때문에 (즉, 아직 내 DB에서 ID가없는 경우) . 이것이 매우 어리석은 경우에는 미안합니다. 나는 EF를 잡기 위해 정말로 고심하고있다. – GooseZA

답변

0

ID를 설정하지 마십시오. 기존 국가 엔티티로 새 목록을 만들고 가능한 한 검색어) :

var newList = new List<HBCountry>(); 
foreach (HBCountry country in hbcampaign.HBTargetingSpec.HBCountries) 
{ 
    var countryMatch = db.HBCountries.FirstOrDefault(c => c.country_code == country.country_code) 
    if (countryMatch != null) 
    { 
     newList.Add(countryMatch); 
    } 
    else 
    { 
     newList.Add(country); 
    }     
} 

hbcampaign.HBTargetingSpec.HBCountries = newList; 

이것은 아마도 가장 좋은 방법은 아니지만, 내가 생각할 수있는 첫 번째 방법입니다.

+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 나는 그것을 일찍 시도했다. 이 경우 foreach 반복 변수이므로 국가에 할당 할 수 없습니다. – GooseZA

+0

아 물론. 내 잘못이야. 수정 된 답변 –

+0

그 트릭을 했어! 정말 고마워. 당신이 말했듯이, 아마 최선의 방법은 아니지만 작동하고 시간이 없어. 다시 한 번 감사드립니다 =) – GooseZA

0

country_code 열에 고유 제한 조건이 있다고 가정해도 엔티티 연결 문제가 해결되지 않습니다. 이것을 시도해 보겠습니다 ...

var countryCodes = hbcampaign.HBTargetingSpec.HBCountries.Select(c => country.country_code); 
// Gives you the list of existing countries in one SQL query 
var existingCountries = db.HBCountries.Where(c => 
    countryCodes.Contains(c.country_code); 

foreach (HBCountry country in existingCountries) 
{ 
    var existingCountry = hbcampaign.HBTargetingSpec.HBCountries.FirstOrDefault(c => c.country_code == country.country_code); 
    existingCountry.CountryID = country.CountryID; 
    db.HBCountries.Detach(country); 
    db.HBCountries.Attach(existingCountry); 
} 

var newCountries = hbcampaign.HBTargetingSpec.HBCountries.Where(c => !existingCountries.Any(c2 => c2.country_code == c.country_code); 
foreach (HBCountry country in newCountries) 
    db.HBCountries.Add(country); 

심지어 간단하게 말해서 국가의 existingCountry에 값을 할당하면됩니다. 내 작은 우주에서 나는 이미 추적 개체를 부착하고 ...이 사용 T4 템플릿 솔루션을 생성

http://msdn.microsoft.com/en-us/data/gg558520.aspx

관련 문제