0

我正试图让我的大脑围绕 Silverlight RIA

我已经到了可以使用对象集合创建对象的地步,该对象集合也具有对象集合。

包含测试问题的测试对象,包含问题答案。

我已经建立了关联,并将数据发送到 silverlight 应用程序。

所以在我加载的回调中......我可以看到所有数据

   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

但下一行给出了错误:“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; }
    }

//数据填充器

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

2 回答 2

1

为什么要调用 ToList()?RIA 返回一个继承自 IEnumerable 的 EntitySet,因此您不需要将其放入列表中。我建议尝试像这样的 linq 语句:

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

至于编辑问题...如果您使用实体框架作为数据模型,请务必在创建域服务时选中“启用编辑”复选框。CanEdit 是一个只读值,它告诉您是否允许编辑。

于 2010-02-04T20:08:56.770 回答
0

嘿,@johnnywhoop,你知道你可以给 FirstorDefault 一个谓词,对吧?意思是,而不是说:

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

你应该说:

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

此外,您需要提供“==”运算符而不是“=”运算符。否则你只是设置它。好吧,实际上,它不会建立。

于 2011-04-06T15:29:14.407 回答