DomainContext, Silverlight 3, код позади, Изменить EntitySet - PullRequest
0 голосов
/ 02 февраля 2010

Я пытаюсь обернуть свой мозг вокруг Silverlight RIA

Я дошел до того, что могу создать объект с набором объектов, у которого также есть набор объектов.

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

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

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

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

var ce = 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; }
    }

// заполнитель данных

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

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Почему вы вызываете ToList ()? RIA возвращает EntitySet, который наследуется от IEnumerable, поэтому вам не нужно помещать его в список. Я бы предложил попробовать выражение linq, например:

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

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

0 голосов
/ 06 апреля 2011

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

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

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

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

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

...