2013-06-14 1 views
0

이 문제에 대해 몇 시간을 보냈습니다. 일반적인 요구 사항으로 볼 수 있으므로 나중에 간단하게 처리하고 싶습니다.ID 컬렉션을 사용하여 컬렉션 인 탐색 속성을 설정하는 방법

public abstract class ModelBase 
{ 
    public int ID { get; set; } 
} 

은 이제부터 답변 모음을 설정하려면 :

public class AnsweredQuestion : ModelBase 
{ 
    public virtual ICollection<Answer> Answers { get; set; } 
} 

내 모든 모델은 하나의 기본 클래스를 상속 :

나는 모음입니다 탐색 속성으로 질문 클래스가 응답 아이디 컬렉션 및 컨트롤러에서이 메서드가 있습니다 - 작동하지 않습니다.

private void SetAnswers(AnsweredQuestion question, 
          IEnumerable<int> newAnswerIDs) 
    { 
     //First remove any answers we don't want 
     question.Answers.RemoveAll(a => !newAnswerIDs.Contains(a.ID)); 

     //Then project the current ids 
     IEnumerable<int> currentAnswerIds = question.Answers.Select(a => a.ID); 

     //Now go to the database to get the answers that match the ids that 
     //we have to add 
     IQueryable<Answer> answersToAdd = _uow.AnswerRepository.All        
       .Where(dbAnswers => newAnswerIDs.Contains(dbAnswers.ID) 
            && 
            !currentAnswerIds.Contains(dbAnswers.ID)); 

     //and add them to the navigation property 
     question.Answers.AddRange(answersToAdd); 
    } 

하지만이 코드는 매우 복잡하며 탐색 속성이있는 각 모델에서이 코드를 반복해서 작성해야한다는 것을 알 수 있습니다.

1 대 다수의 관계인 경우 내 엔티티에 Answer 속성과 AnswerID 속성이있어 프레임 워크가이 문제를 해결할 수 있습니다. 그러나, 내가 아는 한, 많은 관계에서 그렇게 할 수는 없습니다.

누구나 모델의 탐색 속성에서 호출 할 수있는 방법으로 바꾸는 방법을 생각할 수 있습니까? 모델 모음에서 확장 메서드를 만드는 방법에 대해 생각했지만 문제는 데이터베이스에 연결하여 Answers 컬렉션에 추가하기 전에 내가 가진 ID와 일치하는 Answers를 가져와야한다는 것입니다. 확장 방법은

여기

답변

0

내가 함께 온 것입니다 사용할 저장소 알고 있어야합니다 :

public static bool SetById<T>(this ICollection<T> collection, 
    IEnumerable<int> ids, 
    IRepository<T> repo) 
where T : ModelBase 
{ 
    //First remove any answers we don't want 
    int count = collection.Count; 
    collection.RemoveAll(a => !ids.Contains(a.ID)); 
    bool isAltered = count != collection.Count; 

    //Then project the current ids 
    IEnumerable<int> currentIds = collection.Select(a => a.ID); 

    IQueryable<T> toAdd = repo.All.Where(dbAnswers => ids.Contains(dbAnswers.ID) && !currentIds.Contains(dbAnswers.ID)); 
    isAltered = isAltered || toAdd.Any(); 

    //and add them to the navigation property 
    collection.AddRange(toAdd); 

    return isAltered; 
} 

이 ID로 기본 클래스에서 상속 내 모든 개체에 따라 달라집니다 :

public abstract class ModelBase 
{ 
    public int ID { get; set; } 
} 

그리고 내 컨트롤러에서 나는 그것을 이렇게 (내 저장소에 전달) :

question.Answers.SetById(newAnswerIDs, _uow.AnswerRepository); 
관련 문제