2010-02-02 2 views
0

내가 노력하고 내 뇌는 실버 라이트 RIA 주위 wraped하세요DomainContext, 실버 라이트 3, 뒤에 코드 편집 EntitySet은

내가도를 가지고 개체의 컬렉션과 객체를 생성 할 수있는 점에있어 개체의 컬렉션입니다.

테스트 문제를 보유하고 있으며 질문 응답을 보유하고있는 테스트 개체입니다.

나는 연관 관계를 설정했고 그 데이터로 실버 라이트 앱을 만든다.

그래서 내로드 콜백 .... 내가

private void TestLoaded(LoadOperation lo) 
    { 
      var ce =dc.Tests.CanEdit; 
      dc.Tests.ToList()[0].TestQuestions.ToList()[0].StudentAnswerID = 2; 
    } 

VAR 가전까지 = dc.Tests.CanEdit의 모든 데이터를 볼 수 있습니다; // CanEdit = true

'SilverlightApplication2.Web.Question'형식의이 EntitySet은 '편집'작업을 지원하지 않습니다.

내 질문에 CanEdit = true가 표시됩니다. 코드 뒤에 값을 설정하는 좀 더 우아한 방법은 무엇입니까? 코드

나머지 .....

 public class Test 
    { 
     private List<Question> _testQuestions = new List<Question>(); 

     [Key] 
     public int TestID { get; set; } 

     public string TestName { get; set; } 


     [Include] 
     [Association("Assoc1", "TestID", "TestID,QuestionID")] 
     public List<Question> TestQuestions 
     { 
      get { return _testQuestions; } 
      set { _testQuestions = value; } 
     } 
    } 


    public class Question 
    { 
     private List<Answer> _questionAnswers = new List<Answer>(); 

     [Key] 
     public int TestID { get; set; } 

     [Key] 
     public int QuestionID { get; set; } 

     public string QuestionText { get; set; } 

     public int CorrectAnswerID { get; set; } 
     public int StudentAnswerID { get; set; } 

     [Include] 
     [Association("Assoc2", "QuestionID", "QuestionID,AnswerID")] 
     public List<Answer> QuestionAnswers 
     { 
      get { return _questionAnswers; } 
      set { _questionAnswers = value; } 
     } 
    } 



    public class Answer 
    { 
     [Key] 
     public int QuestionID { get; set; } 

     [Key] 
     public int AnswerID { get; set; } 

     public string AnswerText { get; set; } 
    } 

// 데이터 populator

public class TestBuilder 
{ 

    public List<Test> MakeATest() 
    { 
     var ret = new List<Test>(); 

     var t = new Test() 
     { 
      TestID = 1, 
      TestName = "The Test", 
     }; 

     var tq = new Question() { TestID = 1, QuestionID = 1, CorrectAnswerID=1, QuestionText = "T1Q1" }; 

     var a = new Answer() { QuestionID = 1, AnswerID = 1, AnswerText = "T1Q1A1" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 1, AnswerID = 2, AnswerText = "T1Q1A2" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 1, AnswerID = 3, AnswerText = "T1Q1A3" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 1, AnswerID = 4, AnswerText = "T1Q1A4" }; 
     tq.QuestionAnswers.Add(a); 
     t.TestQuestions.Add(tq); 


     //second question 
     tq = new Question() { TestID = 1, QuestionID = 2, CorrectAnswerID = 3, QuestionText = "T1Q2" }; 

     a = new Answer() { QuestionID = 2, AnswerID = 1, AnswerText = "T1Q2A1" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 2, AnswerID = 2, AnswerText = "T1Q2A2" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 2, AnswerID = 3, AnswerText = "T1Q2A3" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 2, AnswerID = 4, AnswerText = "T1Q2A4" }; 
     tq.QuestionAnswers.Add(a); 
     t.TestQuestions.Add(tq); 


     //third question 
     tq = new Question() { TestID = 1, QuestionID =3, CorrectAnswerID = 4, QuestionText = "T1Q3" }; 

     a = new Answer() { QuestionID = 3, AnswerID = 1, AnswerText = "T1Q3A1" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 3, AnswerID = 2, AnswerText = "T1Q3A2" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 3, AnswerID = 3, AnswerText = "T1Q3A3" }; 
     tq.QuestionAnswers.Add(a); 

     a = new Answer() { QuestionID = 3, AnswerID = 4, AnswerText = "T1Q3A4" }; 
     tq.QuestionAnswers.Add(a); 
     t.TestQuestions.Add(tq); 

     ret.Add(t); 

     return ret; 
    } 
} 

도메인 서비스 .....

[EnableClientAccess()] 
public class TestDomainService : DomainService 
{ 
    public IEnumerable<Test> GetTest() 
    { 
     var tb = new TestBuilder(); 
     return tb.MakeATest(); 
    } 

    public void InsertTest(Test currentData) 
    {} 

    public void UpdateTest(Test currentData) 
    {} 

    public void DeleteTest(Test currentData) 
    {} 
} 

실버 측 .. ....

 private void GetTest_Click(object sender, RoutedEventArgs e) 
    { 
     dc.Load(dc.GetTestQuery(), 
       LoadBehavior.RefreshCurrent , 
       TestLoaded, 
       null); 
    } 


    private void TestLoaded(LoadOperation lo) 
    { 
      var ce =dc.Tests.CanEdit; 
      dc.Tests.ToList()[0].TestQuestions.ToList()[0].StudentAnswerID = 2; 
    } 

답변

1

왜 ToList()를 호출합니까? RIA는 IEnumerable에서 상속 한 EntitySet을 반환하므로 목록에 넣을 필요가 없습니다. 나는 같은 LINQ 문을 시도 제안 :

using System.Linq; 
Test mytest = dc.Tests.Where(x=> x.StudentAnswerID = 2).FirstorDefault(); 

은 편집 문제에 관해서는 ... 당신이 "편집 가능"확인란을 선택해야합니다 데이터 모델로 엔티티 프레임 워크를 사용하는 경우 도메인 서비스를 만들 때 . CanEdit은 편집이 허용되는지 여부를 알려주는 읽기 전용 값입니다.

0

안녕하세요, @ johnnywhoop, 당신은 FirstorDefault에게 술어를 줄 수 있다는 것을 알고 있습니까? 대신 말의 의미 :

Test mytest = dc.Tests.Where(x=> x.StudentAnswerID = 2).FirstorDefault(); 

당신은 말을한다 : 또한

Test mytest = dc.Tests.FirstorDefault(x=> x.StudentAnswerID == 2); 

, 당신은 "=="연산자가 아닌 "="연산자를 제공 할 수 있습니다. 그렇지 않으면 그냥 설정하는 것입니다. 글쎄, 실제로, 그것은 지어지지 않을 것입니다.