2010-02-02 9 views
0

Je suis en train de faire mon cerveau wraped autour de Silverlight RIADomainContext, Silverlight 3, code derrière, Modifier EntitySet

Je suis à un point où je peux créer un objet avec une collection d'objets qui a également collection d'objets.

Objet de test contenant des questions de test contenant des réponses aux questions.

J'ai les associations mis en place et les données le rend à l'application silverlight.

Donc, dans mon rappel chargé .... je peux voir toutes les données jusqu'à

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

cé var = dc.Tests.CanEdit; // CanEdit = true

mais la ligne suivante donne l'erreur: Cet EntitySet de type 'SilverlightApplication2.Web.Question' ne prend pas en charge l'opération 'Edit'.

Donc, ma question est pourquoi CanEdit = true? Et quelle est la façon la plus gracieuse de définir la valeur du code derrière?

reste du code .....

 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; } 
    } 

// données 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; 
    } 
} 

DomainService .....

[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) 
    {} 
} 

côté 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; 
    } 

Répondre

1

Pourquoi appelez-vous ToList()? RIA retourne un EntitySet qui hérite de IEnumerable, donc vous ne devriez pas avoir besoin de le mettre dans une liste. Je suggère d'essayer une déclaration LINQ comme:

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

En ce qui concerne le problème de l'édition ... Si vous utilisez Entity Framework en tant que votre modèle de données assurez-vous de cocher la case « Activer l'édition » lorsque vous créez votre service de domaine . CanEdit est une valeur en lecture seule qui vous indique si la modification est autorisée ou non.

0

Hé, @johnnywhoop, vous savez que vous pouvez donner un prédicat à FirstorDefault, n'est-ce pas? Signification, au lieu de dire:

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

Vous devriez dire:

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

, vous aurez également à donner à l'opérateur "==" et non l'opérateur "=". Sinon, vous êtes en train de le régler. Eh bien, en fait, ça ne se construirait pas.