2011-11-21 4 views
0

여러 기존 엔티티와 다른 기존 엔티티 사이의 관계를 추가하고 싶습니다.엔티티 프레임 워크 코드에서 many to many 대다수 관계 추가하기

public void AddFormToTerm(int termId, int formId) 
{ 
    var term = termsRepository.GetTerms().FirstOrDefault(t => t.TermId == termId); 
    var subForms = termsRepository.GetSubForms().Where(t => t.FormId == formId); 

    //I assume this would work by adding existing forms to an existing term. 
    foreach (var subForm in subForms) 
    { 
     term.SubForms.Add(subForm); 
    } 

    termsRepository.UpdateTerm(term, null); 
} 
: 내 서비스 계층이 전화를 걸 때

이제
public IQueryable<Term> GetTerms() 
{ 
    IQueryable<Term> query = db.Terms.AsNoTracking(); 
    return query; 
} 

public Term UpdateTerm(Term term, IEnumerable<Expression<Func<Term, object>>> properties) 
{ 
    if (term.TermId == 0) 
    { 
     throw new InvalidOperationException("Term does not exist"); 
    } 
    db.Terms.Attach(term); 
    if (properties != null) 
    { 
     foreach (var selector in properties) 
     { 
      string propertyName = Helpers.PropertyToString(selector.Body); 
      db.Entry(term).Property(propertyName).IsModified = true; 
     } 
    } 
    db.SaveChanges(); 
    return term; 
} 

나는 가정이 작동합니다 다음과 같이 내가 갱신 저장소 방법이

public class Term 
{ 
    public int TermId { get; set; } 
    public virtual ICollection<SubForm> SubForms { get; set; } 
} 

public class SubForm 
{ 
    public int SubFormId { get; set; } 
    public virtual ICollection<Term> Terms { get; set; } 
} 

: 여기 내 모델입니다

불행히도, 이것은 업데이트되지 않습니다. 데이터베이스를 확인할 때 중간 테이블에 아무 것도 없습니다. 예외도 발생하지 않았습니다.

+0

위의 간단한 설정을 통해 속성 비트없이 실행했고 링크 테이블에 레코드를 얻었습니다. 당신의 설정과 속성 비트없이 시도 해 봤나? – WestDiscGolf

+0

@WestDiscGolf null 일 경우 속성 항목을 건너 뛰는 코드를 추가했습니다. 그것은 여전히 ​​나를 위해 그것을 만들지 않았다. db.Terms.Attach를 사용 했습니까? –

+0

엔티티를 가져 오기 위해 추적을 사용하지 않습니다. –

답변

1

이 경우 AsNoTracking을 사용하는 것이 문제입니다. AsNoTracking이 없으면 작동합니다. 변경 사항 추적 메커니즘을 사용하는 경우에만 다 대다 관계를 업데이트 할 수 있습니다. 그러나 귀하의 코드에서 EF 컨텍스트는 UpdateTerm 메서드에서 Attach을 호출 할 때 처음으로 termSubForms 콜렉션을 알 수 있습니다. EF는 에 SubForms을 추가했음을 알지 못합니다. 왜냐하면 해당 엔티티가 AsNoTracking = "EF, 컨텍스트에 연결하지 마십시오!"를 사용했기 때문에 컨텍스트에 연결되지 않았기 때문입니다. 그러나 = No No No = 데이터베이스 명령을 호출하기 전에 Attach 이후 더 이상 아무 일도 없었습니다. 따라서 AsNoTracking을 제거하거나 추적을 사용하여 다른 메소드 나 매개 변수를 생성하는 것이 가장 좋습니다. 다른 모든 것은 다음과 같은 추악한 "속임수"를 포함 할 것입니다 :

+0

나는 모든 get 문에서 notracking을 삭제했습니다. 이것은 다른 누군가가 작성한 코드에 영향을 줍니까? –

+0

@Lolcoder : 물론 다른 코드에도 영향을 미칠 것입니다 (로드 된 엔티티가 다른 컨텍스트에 연결되면 성능, 버그 ...). 나는 이것을 부주의하게하지 않을 것이다. 이 변경의 영향에 대해 확실하지 않은 경우 기존의 동작에 해당하는 기본값을 사용하여 새 메서드 또는 매개 변수를 만드는 것이 좋습니다. – Slauma

+0

동일한 저장소를 사용하여 관계를 제거 할 수 있습니까? 아니면 이에 대한 새로운 방법을 작성해야합니까? –

관련 문제