2010-02-02 3 views
0

Я пытаюсь получить мой мозг wraped вокруг Silverlight RIADomainContext, Silverlight 3, код позади, Edit EntitySet

Я до точки, где я могу создать объект с коллекцией объектов, также имеет сбор объектов.

Тестируемый объект, который содержит тестовые вопросы, на которые отвечают вопросы.

У меня настроены ассоциации, и данные передаются в приложение silverlight.

Так что в моем загруженном обратном вызове .... я могу видеть все данные до

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

вара с = dc.Tests.CanEdit; // CanEdit = true

, но следующая строка дает ошибку: Этот EntitySet типа «SilverlightApplication2.Web.Question» не поддерживает операцию «Изменить».

Так что мой вопрос, почему 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) 
    {} 
} 

Silverlight сторона .. ....

 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 возвращает EntitySet, который наследует от IEnumerable, поэтому вам не нужно помещать его в список. Я хотел бы предложить пробуя Linq заявление, как:

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

Что касается проблемы редактирования ... Если вы используете Entity Framework в качестве модели данных обязательно установите флажок «Разрешить редактирование» при создании службы домена , CanEdit - это значение readonly, которое сообщает вам, разрешено ли редактирование.

0

Эй, @johnnywhoop, вы знаете, что вы можете дать первокурснику предикат, не так ли? Значение, вместо того чтобы сказать:

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

Вы должны сказать:

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

Кроме того, вы хотите, чтобы дать "==" оператора, а не оператор "=". В противном случае вы просто установите его. Ну, на самом деле, он не будет построен.